mirror of
https://github.com/vale981/clay
synced 2025-03-06 01:51:38 -05:00
Merge pull request #13 from and3rson/commandline-arguments
Commandline arguments
This commit is contained in:
commit
b1391a40bc
4 changed files with 81 additions and 24 deletions
|
@ -194,6 +194,12 @@ You *should* get the sound working. Also docker will reuse the Clay config file
|
||||||
- `<ESC>` or `<CTRL> /` or <CTRL> _ - close most recent notification or popup
|
- `<ESC>` or `<CTRL> /` or <CTRL> _ - close most recent notification or popup
|
||||||
- `<CTRL> x` - exit app
|
- `<CTRL> x` - exit app
|
||||||
|
|
||||||
|
## X keybinds
|
||||||
|
**NOTE:** you need to pass the `--with-x-keybinds` flag for these to work
|
||||||
|
- `<XF86AudioPlay>` - play/pause the song
|
||||||
|
- `<XF86AudioNext>` - play the next song
|
||||||
|
- `<XF86AudioPrev>` - play previous song
|
||||||
|
|
||||||
# Troubleshooting
|
# Troubleshooting
|
||||||
|
|
||||||
At some point, the app may fail. Possible reasons are app bugs,
|
At some point, the app may fail. Possible reasons are app bugs,
|
||||||
|
|
53
clay/app.py
53
clay/app.py
|
@ -9,8 +9,12 @@ Main app entrypoint.
|
||||||
import sys
|
import sys
|
||||||
sys.path.insert(0, '.') # noqa
|
sys.path.insert(0, '.') # noqa
|
||||||
|
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
import urwid
|
import urwid
|
||||||
|
|
||||||
|
from clay import meta
|
||||||
from clay.player import Player
|
from clay.player import Player
|
||||||
from clay.playbar import PlayBar
|
from clay.playbar import PlayBar
|
||||||
from clay.pages.debug import DebugPage
|
from clay.pages.debug import DebugPage
|
||||||
|
@ -23,6 +27,7 @@ from clay.settings import Settings
|
||||||
from clay.notifications import NotificationArea
|
from clay.notifications import NotificationArea
|
||||||
from clay.gp import GP
|
from clay.gp import GP
|
||||||
|
|
||||||
|
|
||||||
BG = '#222'
|
BG = '#222'
|
||||||
|
|
||||||
PALETTE = [
|
PALETTE = [
|
||||||
|
@ -133,8 +138,8 @@ class AppWidget(urwid.Frame):
|
||||||
for page
|
for page
|
||||||
in self.pages
|
in self.pages
|
||||||
]
|
]
|
||||||
self.current_page = None
|
|
||||||
|
|
||||||
|
self.current_page = None
|
||||||
self.loop = None
|
self.loop = None
|
||||||
|
|
||||||
NotificationArea.set_app(self)
|
NotificationArea.set_app(self)
|
||||||
|
@ -373,16 +378,50 @@ class AppWidget(urwid.Frame):
|
||||||
action()
|
action()
|
||||||
|
|
||||||
|
|
||||||
def main():
|
class MultilineVersionAction(argparse.Action):
|
||||||
"""
|
"""
|
||||||
Application entrypoint.
|
An argparser action for multiple lines so we can display the copyright notice
|
||||||
|
Based on: https://stackoverflow.com/a/41147122
|
||||||
"""
|
"""
|
||||||
|
version = "0.6.2"
|
||||||
|
author = "Andrew Dunai"
|
||||||
|
|
||||||
|
def __init__(self, option_strings, dest, nargs=None, **kwargs):
|
||||||
|
if nargs is not None:
|
||||||
|
raise ValueError("nargs not allowed")
|
||||||
|
|
||||||
|
self.prog = os.path.basename(sys.argv[0])
|
||||||
|
super(MultilineVersionAction, self).__init__(option_strings, dest, nargs=0, **kwargs)
|
||||||
|
|
||||||
|
def __call__(self, parser, namespace, values, option_string=None):
|
||||||
|
parser.exit(message=meta.COPYRIGHT_MESSAGE)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# pylint: disable-all
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
prog=meta.APP_NAME,
|
||||||
|
description=meta.DESCRIPTION,
|
||||||
|
epilog="This project is neither affiliated nor endorsed by Google.")
|
||||||
|
|
||||||
|
parser.add_argument("-v", "--version", action=MultilineVersionAction)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
"--with-x-keybinds",
|
||||||
|
help="define global X keybinds (requires Keybinder and PyGObject)",
|
||||||
|
action='store_true')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if args.version:
|
||||||
|
exit(0)
|
||||||
|
|
||||||
|
if args.with_x_keybinds:
|
||||||
|
Player.get().enable_xorg_bindings()
|
||||||
|
|
||||||
|
# Run the actual program
|
||||||
app_widget = AppWidget()
|
app_widget = AppWidget()
|
||||||
loop = urwid.MainLoop(app_widget, PALETTE)
|
loop = urwid.MainLoop(app_widget, PALETTE)
|
||||||
app_widget.set_loop(loop)
|
app_widget.set_loop(loop)
|
||||||
loop.screen.set_terminal_properties(256)
|
loop.screen.set_terminal_properties(256)
|
||||||
loop.run()
|
loop.run()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
||||||
|
|
24
clay/meta.py
24
clay/meta.py
|
@ -1,17 +1,27 @@
|
||||||
"""
|
"""
|
||||||
Predefined values.
|
Predefined values.
|
||||||
"""
|
"""
|
||||||
|
APP_NAME = 'Clay Player'
|
||||||
|
VERSION = '0.6.2'
|
||||||
|
AUTHOR = "Andrew Dunai"
|
||||||
|
DESCRIPTION = "Awesome standalone command line player for Google Play Music"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from codename import codename
|
from codename import codename
|
||||||
except ImportError:
|
except ImportError:
|
||||||
codename = None
|
|
||||||
|
|
||||||
APP_NAME = 'Clay Player'
|
|
||||||
VERSION = '0.6.2'
|
|
||||||
if codename is not None:
|
|
||||||
VERSION_WITH_CODENAME = VERSION + '-' + codename(separator='-', id=VERSION)
|
|
||||||
else:
|
|
||||||
VERSION_WITH_CODENAME = VERSION
|
VERSION_WITH_CODENAME = VERSION
|
||||||
|
else:
|
||||||
|
VERSION_WITH_CODENAME = VERSION + ' (' + codename(separator=' ', id=VERSION) + ')'
|
||||||
|
|
||||||
|
COPYRIGHT_MESSAGE = """{app_name} {version}
|
||||||
|
|
||||||
|
Copyright 2017 - {year} (C) {author} and {app_name} contributors.
|
||||||
|
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licences/gpl.html>
|
||||||
|
This is free software; you are free to change it and redistribute it.
|
||||||
|
There is NO WARRANTY, to the extent permitted by law
|
||||||
|
""".format(app_name=APP_NAME, year=2018,
|
||||||
|
version=VERSION_WITH_CODENAME, author=AUTHOR)
|
||||||
|
|
||||||
USER_AGENT = ' '.join([
|
USER_AGENT = ' '.join([
|
||||||
'Mozilla/5.0 (X11; Linux x86_64)'
|
'Mozilla/5.0 (X11; Linux x86_64)'
|
||||||
'AppleWebKit/537.36 (KHTML, like Gecko)'
|
'AppleWebKit/537.36 (KHTML, like Gecko)'
|
||||||
|
|
|
@ -161,16 +161,6 @@ class Player(object):
|
||||||
|
|
||||||
self.media_player.set_equalizer(self.equalizer)
|
self.media_player.set_equalizer(self.equalizer)
|
||||||
|
|
||||||
# Check whether xorg is running
|
|
||||||
if os.environ.get("DISPLAY") is not None:
|
|
||||||
from clay.hotkeys import HotkeyManager
|
|
||||||
hotkey_manager = HotkeyManager.get()
|
|
||||||
hotkey_manager.play_pause += self.play_pause
|
|
||||||
hotkey_manager.next += self.next
|
|
||||||
hotkey_manager.prev += lambda: self.seek_absolute(0)
|
|
||||||
else:
|
|
||||||
self.logger.debug("X11 isn't running so we can't load the global keybinds")
|
|
||||||
|
|
||||||
self._create_station_notification = None
|
self._create_station_notification = None
|
||||||
self._is_loading = False
|
self._is_loading = False
|
||||||
self.queue = Queue()
|
self.queue = Queue()
|
||||||
|
@ -185,6 +175,18 @@ class Player(object):
|
||||||
|
|
||||||
return cls.instance
|
return cls.instance
|
||||||
|
|
||||||
|
def enable_xorg_bindings(self):
|
||||||
|
"""Enable the global X bindings using keybinder"""
|
||||||
|
if os.environ.get("DISPLAY") is None:
|
||||||
|
self.logger.debug("X11 isn't running so we can't load the global keybinds")
|
||||||
|
return
|
||||||
|
|
||||||
|
from clay.hotkeys import HotkeyManager
|
||||||
|
hotkey_manager = HotkeyManager.get()
|
||||||
|
hotkey_manager.play_pause += self.play_pause
|
||||||
|
hotkey_manager.next += self.next
|
||||||
|
hotkey_manager.prev += lambda: self.seek_absolute(0)
|
||||||
|
|
||||||
def broadcast_state(self):
|
def broadcast_state(self):
|
||||||
"""
|
"""
|
||||||
Write current playback state into a ``/tmp/clay.json`` file.
|
Write current playback state into a ``/tmp/clay.json`` file.
|
||||||
|
|
Loading…
Add table
Reference in a new issue