added cli to server and client
This commit is contained in:
parent
9685fe76a8
commit
73129ba9af
5 changed files with 30 additions and 14 deletions
|
@ -57,7 +57,7 @@ async def handle_buffer(data):
|
||||||
@sio.on("play")
|
@sio.on("play")
|
||||||
async def handle_play(data):
|
async def handle_play(data):
|
||||||
entry = Entry(**data)
|
entry = Entry(**data)
|
||||||
logging.info("Playing %s", entry)
|
print(f"Playing: {entry.artist} - {entry.title} [{entry.album}] ({entry.source}) for {entry.performer}")
|
||||||
try:
|
try:
|
||||||
meta_info = await sources[entry.source].buffer(entry)
|
meta_info = await sources[entry.source].buffer(entry)
|
||||||
await sio.emit("meta-info", {"uuid": data["uuid"], "meta": meta_info})
|
await sio.emit("meta-info", {"uuid": data["uuid"], "meta": meta_info})
|
||||||
|
@ -107,17 +107,18 @@ async def main():
|
||||||
parser = ArgumentParser()
|
parser = ArgumentParser()
|
||||||
|
|
||||||
parser.add_argument("--room", "-r")
|
parser.add_argument("--room", "-r")
|
||||||
parser.add_argument("config")
|
parser.add_argument("--config-file", "-C", default="syng-client.json")
|
||||||
|
parser.add_argument("server")
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
with open(args.config, encoding="utf8") as file:
|
with open(args.config_file, encoding="utf8") as file:
|
||||||
source_config = load(file)
|
source_config = load(file)
|
||||||
sources.update(configure_sources(source_config))
|
sources.update(configure_sources(source_config))
|
||||||
if args.room:
|
if args.room:
|
||||||
state["room"] = args.room
|
state["room"] = args.room
|
||||||
|
|
||||||
await sio.connect("http://127.0.0.1:8080")
|
await sio.connect(args.server)
|
||||||
await sio.wait()
|
await sio.wait()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@ class Entry:
|
||||||
duration: int
|
duration: int
|
||||||
title: str
|
title: str
|
||||||
artist: str
|
artist: str
|
||||||
|
album: str
|
||||||
performer: str
|
performer: str
|
||||||
failed: bool = False
|
failed: bool = False
|
||||||
uuid: UUID = field(default_factory=uuid4)
|
uuid: UUID = field(default_factory=uuid4)
|
||||||
|
@ -26,6 +27,7 @@ class Entry:
|
||||||
"duration": self.duration,
|
"duration": self.duration,
|
||||||
"title": self.title,
|
"title": self.title,
|
||||||
"artist": self.artist,
|
"artist": self.artist,
|
||||||
|
"album": self.album,
|
||||||
"performer": self.performer,
|
"performer": self.performer,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,8 @@ from dataclasses import dataclass
|
||||||
import string
|
import string
|
||||||
import random
|
import random
|
||||||
import logging
|
import logging
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
|
|
||||||
from aiohttp import web
|
from aiohttp import web
|
||||||
import socketio
|
import socketio
|
||||||
|
@ -13,7 +15,8 @@ import socketio
|
||||||
from .entry import Entry
|
from .entry import Entry
|
||||||
from .sources import Source, available_sources
|
from .sources import Source, available_sources
|
||||||
|
|
||||||
sio = socketio.AsyncServer(cors_allowed_origins="*", logger=True, engineio_logger=False)
|
sio = socketio.AsyncServer(cors_allowed_origins="*",
|
||||||
|
logger=True, engineio_logger=False)
|
||||||
app = web.Application()
|
app = web.Application()
|
||||||
sio.attach(app)
|
sio.attach(app)
|
||||||
|
|
||||||
|
@ -103,9 +106,6 @@ async def handle_meta_info(sid, data):
|
||||||
lambda item: str(item.uuid) == data["uuid"],
|
lambda item: str(item.uuid) == data["uuid"],
|
||||||
lambda item: item.update(**data["meta"]),
|
lambda item: item.update(**data["meta"]),
|
||||||
)
|
)
|
||||||
# for item in state.queue:
|
|
||||||
# if str(item.uuid) == data["uuid"]:
|
|
||||||
# item.update(**data["meta"])
|
|
||||||
|
|
||||||
await sio.emit("state", state.queue.to_dict(), room=room)
|
await sio.emit("state", state.queue.to_dict(), room=room)
|
||||||
|
|
||||||
|
@ -135,7 +135,8 @@ async def handle_pop_then_get_next(sid, data={}):
|
||||||
|
|
||||||
|
|
||||||
def gen_id(length=4) -> str:
|
def gen_id(length=4) -> str:
|
||||||
client_id = "".join([random.choice(string.ascii_letters) for _ in range(length)])
|
client_id = "".join([random.choice(string.ascii_letters)
|
||||||
|
for _ in range(length)])
|
||||||
if client_id in clients:
|
if client_id in clients:
|
||||||
client_id = gen_id(length + 1)
|
client_id = gen_id(length + 1)
|
||||||
return client_id
|
return client_id
|
||||||
|
@ -164,7 +165,8 @@ async def handle_register_client(sid, data: dict[str, Any]):
|
||||||
else:
|
else:
|
||||||
logger.info("Registerd new client %s", room)
|
logger.info("Registerd new client %s", room)
|
||||||
initial_entries = [Entry(**entry) for entry in data["queue"]]
|
initial_entries = [Entry(**entry) for entry in data["queue"]]
|
||||||
clients[room] = State(data["secret"], {}, [], Queue(initial_entries), sid)
|
clients[room] = State(data["secret"], {}, [],
|
||||||
|
Queue(initial_entries), sid)
|
||||||
sio.enter_room(sid, room)
|
sio.enter_room(sid, room)
|
||||||
await sio.emit("client-registered", {"success": True, "room": room}, room=sid)
|
await sio.emit("client-registered", {"success": True, "room": room}, room=sid)
|
||||||
|
|
||||||
|
@ -213,7 +215,8 @@ async def handle_config(sid, data):
|
||||||
room = session["room"]
|
room = session["room"]
|
||||||
state = clients[room]
|
state = clients[room]
|
||||||
|
|
||||||
state.sources[data["source"]] = available_sources[data["source"]](data["config"])
|
state.sources[data["source"]] = available_sources[data["source"]](
|
||||||
|
data["config"])
|
||||||
logger.info("Added source %s", data["source"])
|
logger.info("Added source %s", data["source"])
|
||||||
|
|
||||||
|
|
||||||
|
@ -249,7 +252,8 @@ async def handle_get_config(sid, data):
|
||||||
if is_admin:
|
if is_admin:
|
||||||
await sio.emit(
|
await sio.emit(
|
||||||
"config",
|
"config",
|
||||||
{name: source.get_config() for name, source in state.sources.items()},
|
{name: source.get_config()
|
||||||
|
for name, source in state.sources.items()},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -292,7 +296,11 @@ async def handle_search(sid, data: dict[str, str]):
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
web.run_app(app, port=8080)
|
parser = ArgumentParser()
|
||||||
|
parser.add_argument("--host", "-H", default="localhost")
|
||||||
|
parser.add_argument("--port", "-p", default="8080")
|
||||||
|
args = parser.parse_args()
|
||||||
|
web.run_app(app, host=args.host, port=args.port)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from json import load
|
from json import load, dump
|
||||||
from time import sleep, perf_counter
|
from time import sleep, perf_counter
|
||||||
from itertools import zip_longest
|
from itertools import zip_longest
|
||||||
from threading import Event, Lock
|
from threading import Event, Lock
|
||||||
|
@ -39,6 +39,7 @@ class S3Source(Source):
|
||||||
id=filename,
|
id=filename,
|
||||||
source="s3",
|
source="s3",
|
||||||
duration=180,
|
duration=180,
|
||||||
|
album=res.album,
|
||||||
title=res.title,
|
title=res.title,
|
||||||
artist=res.artist,
|
artist=res.artist,
|
||||||
performer=performer,
|
performer=performer,
|
||||||
|
@ -80,6 +81,8 @@ class S3Source(Source):
|
||||||
# obj.object_name
|
# obj.object_name
|
||||||
# for obj in self.minio.list_objects(self.bucket, recursive=True)
|
# for obj in self.minio.list_objects(self.bucket, recursive=True)
|
||||||
# ]
|
# ]
|
||||||
|
# with open("s3_files", "w") as f:
|
||||||
|
# dump(self.index, f)
|
||||||
with open("s3_files", "r") as f:
|
with open("s3_files", "r") as f:
|
||||||
self.index = [item for item in load(f) if item.endswith(".cdg")]
|
self.index = [item for item in load(f) if item.endswith(".cdg")]
|
||||||
print(len(self.index))
|
print(len(self.index))
|
||||||
|
|
|
@ -28,6 +28,7 @@ class YoutubeSource(Source):
|
||||||
osc=True,
|
osc=True,
|
||||||
ytdl=True,
|
ytdl=True,
|
||||||
script_opts="ytdl_hook-ytdl_path=yt-dlp",
|
script_opts="ytdl_hook-ytdl_path=yt-dlp",
|
||||||
|
ytdl_format="bestvideo[height<=720]+bestaudio/best[height<=720]",
|
||||||
fullscreen=True,
|
fullscreen=True,
|
||||||
)
|
)
|
||||||
self.player.play(entry.id)
|
self.player.play(entry.id)
|
||||||
|
@ -44,6 +45,7 @@ class YoutubeSource(Source):
|
||||||
return Entry(
|
return Entry(
|
||||||
id=url,
|
id=url,
|
||||||
source="youtube",
|
source="youtube",
|
||||||
|
album="YouTube",
|
||||||
duration=yt.length,
|
duration=yt.length,
|
||||||
title=yt.title,
|
title=yt.title,
|
||||||
artist=yt.author,
|
artist=yt.author,
|
||||||
|
|
Loading…
Add table
Reference in a new issue