From 1546baab30835734d9cb67b5b9ea18eb0becb7c4 Mon Sep 17 00:00:00 2001 From: DYefremov Date: Sat, 13 May 2023 09:19:35 +0300 Subject: [PATCH] small playback refactoring --- app/settings.py | 9 +++++++ app/tools/media.py | 2 +- app/ui/main.py | 20 ++++++++-------- app/ui/playback.glade | 2 +- app/ui/playback.py | 49 ++++++++++++++++++--------------------- app/ui/settings_dialog.py | 14 +++++------ app/ui/uicommons.py | 11 +-------- 7 files changed, 52 insertions(+), 55 deletions(-) diff --git a/app/settings.py b/app/settings.py index d499a0ca..241857d7 100644 --- a/app/settings.py +++ b/app/settings.py @@ -161,6 +161,15 @@ class PlayStreamsMode(IntEnum): M3U = 2 +class PlaybackMode(IntEnum): + """ Playback mode by double click of mouse in the bouquet (FAV) list. """ + DISABLED = 0 + STREAM = 1 + PLAY = 2 + ZAP = 3 + ZAP_PLAY = 4 + + class EpgSource(IntEnum): HTTP = 0 # HTTP API -> WebIf DAT = 1 # epg.dat file diff --git a/app/tools/media.py b/app/tools/media.py index e9e62630..d727ccf7 100644 --- a/app/tools/media.py +++ b/app/tools/media.py @@ -389,7 +389,7 @@ class VlcPlayer(Player): from app.tools import vlc from app.tools.vlc import EventType - args = f"--quiet {'' if IS_DARWIN else '--no-xlib'}" + args = f"--quiet {'--no-xlib' if IS_LINUX else ''}" self._player = vlc.Instance(args).media_player_new() vlc.libvlc_video_set_key_input(self._player, False) vlc.libvlc_video_set_mouse_input(self._player, False) diff --git a/app/ui/main.py b/app/ui/main.py index 503a90e3..e22dce93 100644 --- a/app/ui/main.py +++ b/app/ui/main.py @@ -47,8 +47,8 @@ from app.eparser.ecommons import CAS, Flag, BouquetService from app.eparser.enigma.bouquets import BqServiceType from app.eparser.iptv import export_to_m3u, StreamType from app.eparser.neutrino.bouquets import BqType -from app.settings import (SettingsType, Settings, SettingsException, SettingsReadException, - IS_DARWIN, PlayStreamsMode, IS_LINUX, USE_HEADER_BAR) +from app.settings import (SettingsType, Settings, SettingsException, SettingsReadException, IS_DARWIN, IS_LINUX, + PlayStreamsMode, PlaybackMode, USE_HEADER_BAR) from app.tools.media import Recorder from app.ui.control import ControlTool from app.ui.epg.epg import EpgCache, EpgSettingsPopover, EpgDialog, EpgTool @@ -69,7 +69,7 @@ from .search import SearchProvider from .service_details_dialog import ServiceDetailsDialog, Action from .settings_dialog import SettingsDialog from .uicommons import (Gtk, Gdk, UI_RESOURCES_PATH, LOCKED_ICON, HIDE_ICON, IPTV_ICON, MOVE_KEYS, KeyboardKey, Column, - FavClickMode, MOD_MASK, APP_FONT, Page, HeaderBar) + MOD_MASK, APP_FONT, Page, HeaderBar) from .xml.dialogs import ServicesUpdateDialog from .xml.edit import SatellitesTool @@ -2058,7 +2058,7 @@ class Application(Gtk.Application): name, model = get_model_data(view) self.delete_views_selection(name) elif event.get_event_type() == Gdk.EventType.DOUBLE_BUTTON_PRESS and event.button == Gdk.BUTTON_PRIMARY: - if self._settings.main_list_playback and self._fav_click_mode is not FavClickMode.DISABLED: + if self._settings.main_list_playback and self._fav_click_mode is not PlaybackMode.DISABLED: if view is self._services_view: self.emit("srv-clicked", self._fav_click_mode) elif view is self._iptv_services_view: @@ -2923,9 +2923,9 @@ class Application(Gtk.Application): view.do_unselect_all(view) elif ctrl and model_name == self.FAV_MODEL: if key is KeyboardKey.P: - self.emit("fav-clicked", FavClickMode.STREAM) + self.emit("fav-clicked", PlaybackMode.STREAM) if key is KeyboardKey.W: - self.emit("fav-clicked", FavClickMode.ZAP_PLAY) + self.emit("fav-clicked", PlaybackMode.ZAP_PLAY) if key is KeyboardKey.Z: self.on_zap() elif key is KeyboardKey.CTRL_L or key is KeyboardKey.CTRL_R: @@ -3039,10 +3039,10 @@ class Application(Gtk.Application): def on_fav_press(self, menu, event): if event.get_event_type() == Gdk.EventType.DOUBLE_BUTTON_PRESS: - if self._fav_click_mode is FavClickMode.DISABLED: + if self._fav_click_mode is PlaybackMode.DISABLED: return - if self._fav_click_mode is FavClickMode.ZAP: + if self._fav_click_mode is PlaybackMode.ZAP: self.on_zap() else: self.emit("fav-clicked", self._fav_click_mode) @@ -3417,7 +3417,7 @@ class Application(Gtk.Application): # ************************* Streams ***************************** # def on_play_stream(self, item=None): - self.emit("fav-clicked", FavClickMode.STREAM) + self.emit("fav-clicked", PlaybackMode.STREAM) def on_play_current(self, item=None): """ starts playback of the current channel. """ @@ -3483,7 +3483,7 @@ class Application(Gtk.Application): # ************************ HTTP API **************************** # def init_http_api(self): - self._fav_click_mode = FavClickMode(self._settings.fav_click_mode) + self._fav_click_mode = PlaybackMode(self._settings.fav_click_mode) api_enable = self._settings.http_api_support GLib.idle_add(self._http_status_image.set_visible, api_enable and not self._receiver_info_box.get_visible()) diff --git a/app/ui/playback.glade b/app/ui/playback.glade index 21088bd7..c8e23a01 100644 --- a/app/ui/playback.glade +++ b/app/ui/playback.glade @@ -262,7 +262,7 @@ Author: Dmitriy Yefremov True False - audio-volume-high-symbolic + audio-card-symbolic diff --git a/app/ui/playback.py b/app/ui/playback.py index 05173cb4..59f0e039 100644 --- a/app/ui/playback.py +++ b/app/ui/playback.py @@ -34,11 +34,11 @@ from gi.repository import GLib, GObject, Gio from app.commons import run_idle, run_with_delay from app.connections import HttpAPI from app.eparser.ecommons import BqServiceType -from app.settings import PlayStreamsMode, IS_DARWIN, SettingsType, USE_HEADER_BAR +from app.settings import PlayStreamsMode, PlaybackMode, IS_DARWIN, SettingsType, USE_HEADER_BAR from app.tools.media import Player from app.ui.dialogs import get_builder, get_message from app.ui.main_helper import get_iptv_url -from app.ui.uicommons import Gtk, Gdk, UI_RESOURCES_PATH, FavClickMode, Column, Page +from app.ui.uicommons import Gtk, Gdk, UI_RESOURCES_PATH, Column, Page class PlayerBox(Gtk.Overlay): @@ -86,7 +86,7 @@ class PlayerBox(Gtk.Overlay): "on_full_screen": self.on_full_screen, "on_close": self.on_close} - builder = get_builder(UI_RESOURCES_PATH + "playback.glade", handlers) + builder = get_builder(f"{UI_RESOURCES_PATH}playback.glade", handlers) self._stack = builder.get_object("stack") self._playback_area = builder.get_object("playback_area") self._playback_area.set_events(Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.POINTER_MOTION_MASK) @@ -117,19 +117,13 @@ class PlayerBox(Gtk.Overlay): return self._playback_area def on_fav_clicked(self, app, mode): - if mode is not FavClickMode.STREAM and not self._app.http_api: + if mode is not PlaybackMode.STREAM and not self._app.http_api: return if len(self._fav_view.get_model()) == 0: return - self._stack.set_visible_child_name("load") - if mode is FavClickMode.STREAM: - self.on_play_stream() - elif mode is FavClickMode.ZAP_PLAY: - self._app.on_zap(self.on_watch) - elif mode is FavClickMode.PLAY: - self.on_play_service() + self.start_playback(mode) def on_srv_clicked(self, app, mode): if not self._app.http_api: @@ -197,7 +191,7 @@ class PlayerBox(Gtk.Overlay): self._player.connect("subtitle-track", self.on_subtitle_track_changed) self._app.app_window.connect("key-press-event", self.on_key_press) - builder = get_builder(UI_RESOURCES_PATH + "app_menu.ui") + builder = get_builder(f"{UI_RESOURCES_PATH}app_menu.ui") self._audio_track_menu = builder.get_object("audio_track_menu") self._subtitle_track_menu = builder.get_object("subtitle_track_menu") audio_menu = builder.get_object("audio_menu") @@ -233,6 +227,7 @@ class PlayerBox(Gtk.Overlay): @run_idle def on_play(self, action=None, value=None): + self._stack.set_visible_child_name("load") self.emit("play", self._current_mrl) def on_pause(self, action=None, value=None): @@ -244,12 +239,14 @@ class PlayerBox(Gtk.Overlay): self.emit("stop", None) def on_next(self, button): - if self._fav_view.do_move_cursor(self._fav_view, Gtk.MovementStep.DISPLAY_LINES, 1): - self.update_buttons() - self.set_player_action() + self.switch_service(1) def on_previous(self, button): - if self._fav_view.do_move_cursor(self._fav_view, Gtk.MovementStep.DISPLAY_LINES, -1): + self.switch_service(-1) + + def switch_service(self, count): + self._fav_view.grab_focus() + if self._fav_view.do_move_cursor(self._fav_view, Gtk.MovementStep.DISPLAY_LINES, count): self.update_buttons() self.set_player_action() @@ -324,14 +321,7 @@ class PlayerBox(Gtk.Overlay): @run_with_delay(1) def set_player_action(self): - click_mode = FavClickMode(self._app.app_settings.fav_click_mode) - self._stack.set_visible_child_name("load") - if click_mode is FavClickMode.PLAY: - self.on_play_service() - elif click_mode is FavClickMode.ZAP_PLAY: - self._app.on_zap(self.on_watch) - elif click_mode is FavClickMode.STREAM: - self.on_play_stream() + self.start_playback(PlaybackMode(self._app.app_settings.fav_click_mode)) def update_buttons(self): if self._player: @@ -463,9 +453,16 @@ class PlayerBox(Gtk.Overlay): if self._player: self.emit("play", url) - self._fav_view.grab_focus() + def start_playback(self, mode): + self._stack.set_visible_child_name("load") + if mode is PlaybackMode.PLAY: + self.on_play_service() + elif mode is PlaybackMode.ZAP_PLAY: + self._app.on_zap(self.on_watch) + elif mode is PlaybackMode.STREAM: + self.on_play_stream() - @run_idle + @run_with_delay(1) def on_played(self, player, duration): self._stack.set_visible_child_name("playback") if not IS_DARWIN: diff --git a/app/ui/settings_dialog.py b/app/ui/settings_dialog.py index 61eaf7f7..2a3c07d4 100644 --- a/app/ui/settings_dialog.py +++ b/app/ui/settings_dialog.py @@ -32,10 +32,10 @@ from collections import Counter from app.commons import run_task, run_idle, log from app.connections import test_telnet, test_ftp, TestException, test_http, HttpApiException -from app.settings import SettingsType, Settings, PlayStreamsMode, IS_LINUX, SEP, IS_WIN +from app.settings import SettingsType, Settings, PlayStreamsMode, PlaybackMode, IS_LINUX, SEP, IS_WIN from app.ui.dialogs import show_dialog, DialogType, get_message, get_chooser_dialog, get_builder from .main_helper import update_entry_data, scroll_to, get_picon_pixbuf -from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, FavClickMode, DEFAULT_ICON, APP_FONT, HeaderBar +from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, DEFAULT_ICON, APP_FONT, HeaderBar class SettingsDialog: @@ -694,17 +694,17 @@ class SettingsDialog: if self._main_stack.get_visible_child_name() != "streaming": return - mode = FavClickMode(int(self._double_click_combo_box.get_active_id())) - if mode is FavClickMode.PLAY: + mode = PlaybackMode(int(self._double_click_combo_box.get_active_id())) + if mode is PlaybackMode.PLAY: self.show_info_message("Operates in standby mode or current active transponder!", Gtk.MessageType.WARNING) - elif mode is FavClickMode.STREAM: + elif mode is PlaybackMode.STREAM: self.show_info_message("Playback IPTV streams only!", Gtk.MessageType.WARNING) - elif mode is FavClickMode.DISABLED: + elif mode is PlaybackMode.DISABLED: self._allow_main_list_playback_switch.set_active(False) else: self.on_info_bar_close() - self._allow_main_list_playback_switch.set_sensitive(mode is not FavClickMode.DISABLED) + self._allow_main_list_playback_switch.set_sensitive(mode is not PlaybackMode.DISABLED) def on_play_mode_changed(self, button): if self._main_stack.get_visible_child_name() != "streaming": diff --git a/app/ui/uicommons.py b/app/ui/uicommons.py index f2a47a82..53a1cbbe 100644 --- a/app/ui/uicommons.py +++ b/app/ui/uicommons.py @@ -37,7 +37,7 @@ gi.require_version("Gtk", "3.0") gi.require_version("Gdk", "3.0") from gi.repository import Gtk, Gdk, GLib -from app.settings import Settings, SettingsException, IS_DARWIN, GTK_PATH, IS_LINUX +from app.settings import Settings, SettingsException, IS_DARWIN, IS_LINUX, GTK_PATH # Setting mod mask for keyboard depending on platform MOD_MASK = Gdk.ModifierType.MOD2_MASK if IS_DARWIN else Gdk.ModifierType.CONTROL_MASK @@ -186,15 +186,6 @@ class Page(Enum): CONTROL = "control" -class FavClickMode(IntEnum): - """ Double click mode on the service in the bouquet(FAV) list. """ - DISABLED = 0 - STREAM = 1 - PLAY = 2 - ZAP = 3 - ZAP_PLAY = 4 - - class ViewTarget(Enum): """ Used for set target view. """ BOUQUET = 0