Removed syng-client
, syng-server
and syng-gui
in favor of syng <subcommand>
This commit is contained in:
parent
6a84567545
commit
e2655a483b
4 changed files with 36 additions and 112 deletions
|
@ -8,9 +8,6 @@ readme = "README.md"
|
||||||
include = ["syng/static"]
|
include = ["syng/static"]
|
||||||
|
|
||||||
[tool.poetry.scripts]
|
[tool.poetry.scripts]
|
||||||
syng-client = "syng.client:main"
|
|
||||||
syng-server = "syng.server:main"
|
|
||||||
syng-gui = "syng.gui:main"
|
|
||||||
syng = "syng.main:main"
|
syng = "syng.main:main"
|
||||||
|
|
||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
|
|
|
@ -1,53 +1,29 @@
|
||||||
"""
|
"""
|
||||||
Module for the playback client.
|
Module for the playback client.
|
||||||
|
|
||||||
Excerp from the help::
|
The client connects to the server via the socket.io protocol, and plays the
|
||||||
|
songs, that are sent by the server.
|
||||||
usage: client.py [-h] [--room ROOM] [--secret SECRET] \
|
|
||||||
[--config-file CONFIG_FILE] [--server server]
|
|
||||||
|
|
||||||
options:
|
|
||||||
-h, --help show this help message and exit
|
|
||||||
--room ROOM, -r ROOM
|
|
||||||
--secret SECRET, -s SECRET
|
|
||||||
--config-file CONFIG_FILE, -C CONFIG_FILE
|
|
||||||
--key KEY, -k KEY
|
|
||||||
--server
|
|
||||||
|
|
||||||
The config file should be a yaml file in the following style::
|
|
||||||
|
|
||||||
sources:
|
|
||||||
SOURCE1:
|
|
||||||
configuration for SOURCE
|
|
||||||
SOURCE2:
|
|
||||||
configuration for SOURCE
|
|
||||||
...
|
|
||||||
config:
|
|
||||||
server: ...
|
|
||||||
room: ...
|
|
||||||
preview_duration: ...
|
|
||||||
secret: ...
|
|
||||||
last_song: ...
|
|
||||||
waiting_room_policy: ..
|
|
||||||
key: ..
|
|
||||||
|
|
||||||
|
Playback is done by the :py:class:`syng.sources.source.Source` objects, that
|
||||||
|
are configured in the `sources` section of the configuration file and can currently
|
||||||
|
be one of:
|
||||||
|
- `youtube`
|
||||||
|
- `s3`
|
||||||
|
- `files`
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
import datetime
|
import datetime
|
||||||
import logging
|
import logging
|
||||||
import os
|
|
||||||
import secrets
|
import secrets
|
||||||
import string
|
import string
|
||||||
from sys import argv, stderr
|
|
||||||
import tempfile
|
import tempfile
|
||||||
import signal
|
import signal
|
||||||
from argparse import ArgumentParser, Namespace
|
from argparse import Namespace
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from dataclasses import field
|
from dataclasses import field
|
||||||
from traceback import print_exc
|
from traceback import print_exc
|
||||||
from typing import Any, Optional
|
from typing import Any, Optional
|
||||||
import platformdirs
|
|
||||||
|
|
||||||
from qrcode.main import QRCode
|
from qrcode.main import QRCode
|
||||||
|
|
||||||
|
@ -510,7 +486,6 @@ def run_client(args: Namespace) -> None:
|
||||||
if "config" not in config:
|
if "config" not in config:
|
||||||
config["config"] = {}
|
config["config"] = {}
|
||||||
|
|
||||||
config["config"] |= {"key": args.key}
|
|
||||||
if args.room:
|
if args.room:
|
||||||
config["config"] |= {"room": args.room}
|
config["config"] |= {"room": args.room}
|
||||||
if args.secret:
|
if args.secret:
|
||||||
|
@ -519,32 +494,3 @@ def run_client(args: Namespace) -> None:
|
||||||
config["config"] |= {"server": args.server}
|
config["config"] |= {"server": args.server}
|
||||||
|
|
||||||
create_async_and_start_client(config)
|
create_async_and_start_client(config)
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
|
||||||
"""Entry point for the syng-client script."""
|
|
||||||
|
|
||||||
print(
|
|
||||||
f"Starting the client with {argv[0]} is deprecated. "
|
|
||||||
"Please use `syng client` to start the client",
|
|
||||||
file=stderr,
|
|
||||||
)
|
|
||||||
parser: ArgumentParser = ArgumentParser()
|
|
||||||
|
|
||||||
parser.add_argument("--room", "-r")
|
|
||||||
parser.add_argument("--secret", "-s")
|
|
||||||
parser.add_argument(
|
|
||||||
"--config-file",
|
|
||||||
"-C",
|
|
||||||
default=f"{os.path.join(platformdirs.user_config_dir('syng'), 'config.yaml')}",
|
|
||||||
)
|
|
||||||
parser.add_argument("--key", "-k", default=None)
|
|
||||||
parser.add_argument("--server", "-S")
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
run_client(args)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
|
|
21
syng/main.py
21
syng/main.py
|
@ -9,10 +9,27 @@ imports them if they are. If they are not available, the application will not
|
||||||
run the client or server functions.
|
run the client or server functions.
|
||||||
|
|
||||||
Client usage: syng client [-h] [--room ROOM] [--secret SECRET] \
|
Client usage: syng client [-h] [--room ROOM] [--secret SECRET] \
|
||||||
[--config-file CONFIG_FILE] [--key KEY] [--server SERVER]
|
[--config-file CONFIG_FILE] [--server SERVER]
|
||||||
Server usage: syng server [-h] [--host HOST] [--port PORT] [--root-folder ROOT_FOLDER] \
|
Server usage: syng server [-h] [--host HOST] [--port PORT] [--root-folder ROOT_FOLDER] \
|
||||||
[--registration-keyfile REGISTRATION_KEYFILE] [--private] [--restricted]
|
[--registration-keyfile REGISTRATION_KEYFILE] [--private] [--restricted]
|
||||||
GUI usage: syng gui
|
GUI usage: syng gui
|
||||||
|
|
||||||
|
The config file for the client should be a yaml file in the following style::
|
||||||
|
|
||||||
|
sources:
|
||||||
|
SOURCE1:
|
||||||
|
configuration for SOURCE
|
||||||
|
SOURCE2:
|
||||||
|
configuration for SOURCE
|
||||||
|
...
|
||||||
|
config:
|
||||||
|
server: ...
|
||||||
|
room: ...
|
||||||
|
preview_duration: ...
|
||||||
|
secret: ...
|
||||||
|
last_song: ...
|
||||||
|
waiting_room_policy: ..
|
||||||
|
key: ..
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
@ -66,7 +83,7 @@ def main() -> None:
|
||||||
"-C",
|
"-C",
|
||||||
default=f"{os.path.join(platformdirs.user_config_dir('syng'), 'config.yaml')}",
|
default=f"{os.path.join(platformdirs.user_config_dir('syng'), 'config.yaml')}",
|
||||||
)
|
)
|
||||||
client_parser.add_argument("--key", "-k", default=None)
|
# client_parser.add_argument("--key", "-k", default=None)
|
||||||
client_parser.add_argument("--server", "-S")
|
client_parser.add_argument("--server", "-S")
|
||||||
|
|
||||||
sub_parsers.add_parser("gui")
|
sub_parsers.add_parser("gui")
|
||||||
|
|
|
@ -1,16 +1,14 @@
|
||||||
"""
|
"""
|
||||||
Module for the Server.
|
Module for the Server.
|
||||||
|
|
||||||
Starts a async socketio server, and serves the web client::
|
The server listens for incoming connections from playback clients and web
|
||||||
|
clients via the socket.io protocol.
|
||||||
usage: server.py [-h] [--host HOST] [--port PORT] [--root-folder PATH]
|
|
||||||
|
|
||||||
options:
|
|
||||||
-h, --help show this help message and exit
|
|
||||||
--host HOST, -H HOST
|
|
||||||
--port PORT, -p PORT
|
|
||||||
--root-folder PATH, -r PATH
|
|
||||||
|
|
||||||
|
It manages multiple independent rooms, each with its own queue and configuration.
|
||||||
|
If configured, the server can be in private mode, where only playback clients with
|
||||||
|
a valid registration key can connect. It can also be in restricted mode, where only
|
||||||
|
search is forwarded to the playback client, unless the client has a valid registration
|
||||||
|
key.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
@ -23,10 +21,9 @@ import os
|
||||||
import random
|
import random
|
||||||
import string
|
import string
|
||||||
from json.decoder import JSONDecodeError
|
from json.decoder import JSONDecodeError
|
||||||
from argparse import ArgumentParser, Namespace
|
from argparse import Namespace
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from dataclasses import field
|
from dataclasses import field
|
||||||
from sys import argv, stderr
|
|
||||||
from typing import Any
|
from typing import Any
|
||||||
from typing import AsyncGenerator
|
from typing import AsyncGenerator
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
@ -1240,36 +1237,3 @@ def run_server(args: Namespace) -> None:
|
||||||
app.cleanup_ctx.append(background_tasks)
|
app.cleanup_ctx.append(background_tasks)
|
||||||
|
|
||||||
web.run_app(app, host=args.host, port=args.port)
|
web.run_app(app, host=args.host, port=args.port)
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
|
||||||
"""
|
|
||||||
Configure and start the server.
|
|
||||||
|
|
||||||
Parse the command line arguments, register static routes to serve the web
|
|
||||||
client and start the server.
|
|
||||||
|
|
||||||
:rtype: None
|
|
||||||
"""
|
|
||||||
|
|
||||||
print(
|
|
||||||
f"Starting the server with {argv[0]} is deprecated. "
|
|
||||||
"Please use `syng server` to start the server",
|
|
||||||
file=stderr,
|
|
||||||
)
|
|
||||||
|
|
||||||
root_path = os.path.join(os.path.dirname(__file__), "static")
|
|
||||||
parser = ArgumentParser()
|
|
||||||
parser.add_argument("--host", "-H", default="localhost")
|
|
||||||
parser.add_argument("--port", "-p", type=int, default=8080)
|
|
||||||
parser.add_argument("--root-folder", "-r", default=root_path)
|
|
||||||
parser.add_argument("--registration-keyfile", "-k", default=None)
|
|
||||||
parser.add_argument("--private", "-P", action="store_true", default=False)
|
|
||||||
parser.add_argument("--restricted", "-R", action="store_true", default=False)
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
run_server(args)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue