Working on pause play

This commit is contained in:
Sumner Evans
2019-06-15 16:54:07 -06:00
parent 9f5c274dd7
commit 941ad87961
5 changed files with 52 additions and 14 deletions

2
.flake8 Normal file
View File

@@ -0,0 +1,2 @@
[flake8]
ignore = E402

View File

@@ -1,5 +1,7 @@
import os import os
import mpv
import gi import gi
gi.require_version('Gtk', '3.0') gi.require_version('Gtk', '3.0')
from gi.repository import Gio, Gtk, GLib, Gdk from gi.repository import Gio, Gtk, GLib, Gdk
@@ -28,6 +30,9 @@ class LibremsonicApp(Gtk.Application):
'Specify a configuration file. Defaults to ~/.config/libremsonic/config.json', 'Specify a configuration file. Defaults to ~/.config/libremsonic/config.json',
None) None)
self.player = mpv.MPV()
self.is_playing = False
# Handle command line option parsing. # Handle command line option parsing.
def do_command_line(self, command_line): def do_command_line(self, command_line):
options = command_line.get_options_dict() options = command_line.get_options_dict()
@@ -40,8 +45,7 @@ class LibremsonicApp(Gtk.Application):
else: else:
# Default to ~/.config/libremsonic. # Default to ~/.config/libremsonic.
config_folder = (os.environ.get('XDG_CONFIG_HOME') config_folder = (os.environ.get('XDG_CONFIG_HOME')
or os.environ.get('APPDATA') or os.path.join( or os.path.expanduser('~/.config'))
os.environ.get('HOME'), '.config'))
config_folder = os.path.join(config_folder, 'libremsonic') config_folder = os.path.join(config_folder, 'libremsonic')
self.config_file = os.path.join(config_folder, 'config.yaml') self.config_file = os.path.join(config_folder, 'config.yaml')
@@ -58,6 +62,11 @@ class LibremsonicApp(Gtk.Application):
action.connect('activate', self.on_configure_servers) action.connect('activate', self.on_configure_servers)
self.add_action(action) self.add_action(action)
# Add action for configuring servers
action = Gio.SimpleAction.new('play_pause', None)
action.connect('activate', self.on_play_pause)
self.add_action(action)
def do_activate(self): def do_activate(self):
# We only allow a single window and raise any existing ones # We only allow a single window and raise any existing ones
if not self.window: if not self.window:
@@ -79,27 +88,40 @@ class LibremsonicApp(Gtk.Application):
# Load the configuration and update the UI with the curent server, if # Load the configuration and update the UI with the curent server, if
# it exists. If there is no current server, show the dialog to select a # it exists. If there is no current server, show the dialog to select a
# server. # server.
self.load_settings() self.load_config()
if self.config.current_server is None: if self.config.current_server is None:
self.show_configure_servers_dialog() self.show_configure_servers_dialog()
else: else:
self.on_connected_server_changed(None, self.config.current_server) self.on_connected_server_changed(None, self.config.current_server)
# ########## ACTION HANDLERS ########## #
def on_configure_servers(self, action, param): def on_configure_servers(self, action, param):
self.show_configure_servers_dialog() self.show_configure_servers_dialog()
def on_play_pause(self, action, param):
if self.is_playing:
self.player.command('cycle', 'pause')
else:
self.player.loadfile(
'/home/sumner/Music/Sapphyre/All You See Is Christ (live).mp3')
self.is_playing = not self.is_playing
self.update_window()
def on_server_list_changed(self, action, servers): def on_server_list_changed(self, action, servers):
self.config.servers = servers self.config.servers = servers
self.save_settings() self.save_config()
def on_connected_server_changed(self, action, current_server): def on_connected_server_changed(self, action, current_server):
self.config.current_server = current_server self.config.current_server = current_server
self.save_settings() self.save_config()
# Update the window according to the new server configuration. # Update the window according to the new server configuration.
self.window.update(self.config.servers[self.config.current_server]) self.update_window()
# ########## HELPER METHODS ########## #
def show_configure_servers_dialog(self): def show_configure_servers_dialog(self):
"""Show the Connect to Server dialog.""" """Show the Connect to Server dialog."""
dialog = ConfigureServersDialog(self.window, self.config) dialog = ConfigureServersDialog(self.window, self.config)
@@ -109,8 +131,15 @@ class LibremsonicApp(Gtk.Application):
dialog.run() dialog.run()
dialog.destroy() dialog.destroy()
def load_settings(self): def load_config(self):
self.config = get_config(self.config_file) self.config = get_config(self.config_file)
def save_settings(self): def save_config(self):
save_config(self.config, self.config_file) save_config(self.config, self.config_file)
def update_window(self):
self.window.update(
server=self.config.servers[self.config.current_server],
current_song=None,
is_playing=self.is_playing,
)

View File

@@ -37,7 +37,8 @@ class MainWindow(Gtk.ApplicationWindow):
flowbox.pack_start(self.player_controls, False, True, 0) flowbox.pack_start(self.player_controls, False, True, 0)
self.add(flowbox) self.add(flowbox)
def update(self, server: Optional[Server]): # TODO the song should eventually be an API object...
def update(self, server: Optional[Server], current_song, is_playing):
# Update the Connected to label on the popup menu. # Update the Connected to label on the popup menu.
if server: if server:
self.connected_to_label.set_markup(f'Connected to {server.name}') self.connected_to_label.set_markup(f'Connected to {server.name}')
@@ -45,8 +46,7 @@ class MainWindow(Gtk.ApplicationWindow):
self.connected_to_label.set_markup( self.connected_to_label.set_markup(
f'<span style="italic">Not Connected to a Server</span>') f'<span style="italic">Not Connected to a Server</span>')
print(self.panels) self.player_controls.update(current_song, is_playing)
print(self.player_controls)
def create_stack(self, **kwargs): def create_stack(self, **kwargs):
stack = Gtk.Stack() stack = Gtk.Stack()

View File

@@ -21,6 +21,11 @@ class PlayerControls(Gtk.ActionBar):
self.set_center_widget(self.playback_controls) self.set_center_widget(self.playback_controls)
self.pack_end(self.up_next_volume) self.pack_end(self.up_next_volume)
def update(self, current_song, playing):
self.play_button.get_child().set_from_icon_name(
f"media-playback-{'start' if not playing else 'pause'}-symbolic",
Gtk.IconSize.LARGE_TOOLBAR)
def create_song_display(self): def create_song_display(self):
box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
@@ -79,12 +84,13 @@ class PlayerControls(Gtk.ActionBar):
buttons.pack_start(previous_button, False, False, 5) buttons.pack_start(previous_button, False, False, 5)
# Play button # Play button
play_button = self.button_with_icon( self.play_button = self.button_with_icon(
'media-playback-start-symbolic', 'media-playback-start-symbolic',
relief=True, relief=True,
icon_size=Gtk.IconSize.LARGE_TOOLBAR) icon_size=Gtk.IconSize.LARGE_TOOLBAR)
play_button.set_name('play-button') self.play_button.set_name('play-button')
buttons.pack_start(play_button, False, False, 0) self.play_button.set_action_name('app.play_pause')
buttons.pack_start(self.play_button, False, False, 0)
# Next button # Next button
next_button = self.button_with_icon( next_button = self.button_with_icon(

View File

@@ -44,6 +44,7 @@ setup(
packages=find_packages(exclude=['tests']), packages=find_packages(exclude=['tests']),
install_requires=[ install_requires=[
'python-dateutil', 'python-dateutil',
'python-mpv',
'requests', 'requests',
'pyyaml', 'pyyaml',
'gobject', 'gobject',