welcome to BAPSicle and some data types
This commit is contained in:
parent
1e464b2247
commit
ec6d3b0854
7 changed files with 54 additions and 22 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -26,4 +26,4 @@ venv/
|
||||||
|
|
||||||
config.py
|
config.py
|
||||||
|
|
||||||
dev/test.mp3
|
dev/welcome.mp3
|
|
@ -3,4 +3,5 @@ flask
|
||||||
mutagen
|
mutagen
|
||||||
sounddevice
|
sounddevice
|
||||||
autopep8
|
autopep8
|
||||||
setproctitle
|
setproctitle
|
||||||
|
pyttsx3
|
|
@ -1,3 +1,6 @@
|
||||||
# Flask Details
|
# Flask Details
|
||||||
HOST: str = "localhost"
|
HOST: str = "localhost"
|
||||||
PORT: int = 5000
|
PORT: int = 5000
|
||||||
|
|
||||||
|
# BAPSicle Details
|
||||||
|
VERSION: float = 1.0
|
18
plan.py
18
plan.py
|
@ -32,15 +32,19 @@ class PlanObject:
|
||||||
def name(self) -> str:
|
def name(self) -> str:
|
||||||
return "{0} - {1}".format(self._title, self._artist) if self._artist else self._title
|
return "{0} - {1}".format(self._title, self._artist) if self._artist else self._title
|
||||||
|
|
||||||
|
@property
|
||||||
|
def __dict__(self) -> Dict[str, any]:
|
||||||
|
return {
|
||||||
|
"timeslotitemid": self.timeslotitemid,
|
||||||
|
"title": self._title,
|
||||||
|
"artist": self._artist,
|
||||||
|
"name": self.name,
|
||||||
|
"filename": self.filename
|
||||||
|
}
|
||||||
|
|
||||||
def __init__(self, new_item: Dict[str, any]):
|
def __init__(self, new_item: Dict[str, any]):
|
||||||
self._timeslotitemid = new_item["timeslotitemid"]
|
self._timeslotitemid = new_item["timeslotitemid"]
|
||||||
self._filename = new_item["filename"]
|
self._filename = new_item["filename"]
|
||||||
self._title = new_item["title"]
|
self._title = new_item["title"]
|
||||||
self._artist = new_item["artist"]
|
self._artist = new_item["artist"]
|
||||||
|
|
||||||
def __dict__(self) -> Dict[str, any]:
|
|
||||||
return {
|
|
||||||
"timeslotitemid": self.timeslotitemid,
|
|
||||||
"name": self.name,
|
|
||||||
"filename": self.filename
|
|
||||||
}
|
|
14
player.py
14
player.py
|
@ -108,8 +108,8 @@ class Player():
|
||||||
state = copy.copy(self.state.state)
|
state = copy.copy(self.state.state)
|
||||||
|
|
||||||
# Not the biggest fan of this, but maybe I'll get a better solution for this later
|
# Not the biggest fan of this, but maybe I'll get a better solution for this later
|
||||||
state["loaded_item"] = state["loaded_item"].__dict__() if state["loaded_item"] else None
|
state["loaded_item"] = state["loaded_item"].__dict__ if state["loaded_item"] else None
|
||||||
state["show_plan"] = [repr.__dict__() for repr in state["show_plan"]]
|
state["show_plan"] = [repr.__dict__ for repr in state["show_plan"]]
|
||||||
|
|
||||||
res = json.dumps(state)
|
res = json.dumps(state)
|
||||||
return res
|
return res
|
||||||
|
@ -304,8 +304,8 @@ class Player():
|
||||||
self.output()
|
self.output()
|
||||||
|
|
||||||
if loaded_state["loaded_item"]:
|
if loaded_state["loaded_item"]:
|
||||||
print("Loading filename: " + loaded_state["loaded_item"["filename"]])
|
print("Loading filename: " + loaded_state["loaded_item"].filename)
|
||||||
self.load(loaded_state["loaded_item"["timeslotitemid"]])
|
self.load(loaded_state["loaded_item"].timeslotitemid)
|
||||||
|
|
||||||
if loaded_state["pos_true"] != 0:
|
if loaded_state["pos_true"] != 0:
|
||||||
print("Seeking to pos_true: " + str(loaded_state["pos_true"]))
|
print("Seeking to pos_true: " + str(loaded_state["pos_true"]))
|
||||||
|
@ -353,8 +353,10 @@ class Player():
|
||||||
"CLEAR": lambda: self._retMsg(self.clear_channel_plan())
|
"CLEAR": lambda: self._retMsg(self.clear_channel_plan())
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.last_msg in message_types.keys():
|
message_type: str = self.last_msg.split(":")[0]
|
||||||
message_types[self.last_msg]()
|
|
||||||
|
if message_type in message_types.keys():
|
||||||
|
message_types[message_type]()
|
||||||
|
|
||||||
elif (self.last_msg == 'QUIT'):
|
elif (self.last_msg == 'QUIT'):
|
||||||
self.running = False
|
self.running = False
|
||||||
|
|
25
server.py
25
server.py
|
@ -20,6 +20,7 @@ import json
|
||||||
import sounddevice as sd
|
import sounddevice as sd
|
||||||
import setproctitle
|
import setproctitle
|
||||||
import config
|
import config
|
||||||
|
import pyttsx3
|
||||||
|
|
||||||
setproctitle.setproctitle("BAPSicle - Server")
|
setproctitle.setproctitle("BAPSicle - Server")
|
||||||
|
|
||||||
|
@ -239,15 +240,31 @@ def startServer():
|
||||||
)
|
)
|
||||||
channel_p[channel].start()
|
channel_p[channel].start()
|
||||||
|
|
||||||
# There is a plan for this, but I'm going to leave this here until i sort it
|
# Welcome Speech
|
||||||
|
|
||||||
|
text_to_speach = pyttsx3.init()
|
||||||
|
text_to_speach.save_to_file(
|
||||||
|
"""Thank-you for installing BAPSicle - the play-out server from the broadcasting and presenting suite.
|
||||||
|
This server is accepting connections on port {0}
|
||||||
|
The version of the server service is {1}
|
||||||
|
Please refer to the documentation included with this application for further assistance.""".format(
|
||||||
|
config.PORT,
|
||||||
|
config.VERSION
|
||||||
|
),
|
||||||
|
"dev/welcome.mp3"
|
||||||
|
)
|
||||||
|
text_to_speach.runAndWait()
|
||||||
|
|
||||||
new_item: Dict[str, any] = {
|
new_item: Dict[str, any] = {
|
||||||
"timeslotitemid": 0,
|
"timeslotitemid": 0,
|
||||||
"filename": "dev/test.mp3",
|
"filename": "dev/welcome.mp3",
|
||||||
"title": "Test File",
|
"title": "Welcome to BAPSicle",
|
||||||
"artist": None,
|
"artist": "University Radio York",
|
||||||
}
|
}
|
||||||
|
|
||||||
channel_to_q[0].put("ADD:" + json.dumps(new_item))
|
channel_to_q[0].put("ADD:" + json.dumps(new_item))
|
||||||
|
channel_to_q[0].put("LOAD:0")
|
||||||
|
channel_to_q[0].put("PLAY")
|
||||||
|
|
||||||
# Don't use reloader, it causes Nested Processes!
|
# Don't use reloader, it causes Nested Processes!
|
||||||
app.run(host=config.HOST, port=config.PORT, debug=True, use_reloader=False)
|
app.run(host=config.HOST, port=config.PORT, debug=True, use_reloader=False)
|
||||||
|
|
|
@ -2,6 +2,7 @@ import copy
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
from helpers.os_environment import resolve_external_file_path
|
from helpers.os_environment import resolve_external_file_path
|
||||||
|
from plan import PlanObject
|
||||||
|
|
||||||
|
|
||||||
class StateManager:
|
class StateManager:
|
||||||
|
@ -35,6 +36,10 @@ class StateManager:
|
||||||
else:
|
else:
|
||||||
self.__state = json.loads(file_state)
|
self.__state = json.loads(file_state)
|
||||||
|
|
||||||
|
# Turn from JSON -> PlanObject
|
||||||
|
self.__state["loaded_item"] = PlanObject(self.__state["loaded_item"]) if self.__state["loaded_item"] else None
|
||||||
|
self.__state["show_plan"] = [PlanObject(obj) for obj in self.__state["show_plan"]]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def state(self):
|
def state(self):
|
||||||
return self.__state
|
return self.__state
|
||||||
|
@ -47,8 +52,8 @@ class StateManager:
|
||||||
|
|
||||||
# Not the biggest fan of this, but maybe I'll get a better solution for this later
|
# Not the biggest fan of this, but maybe I'll get a better solution for this later
|
||||||
state_to_json = copy.copy(state)
|
state_to_json = copy.copy(state)
|
||||||
state_to_json["loaded_item"] = state_to_json["loaded_item"].__dict__() if state_to_json["loaded_item"] else None
|
state_to_json["loaded_item"] = state_to_json["loaded_item"].__dict__ if state_to_json["loaded_item"] else None
|
||||||
state_to_json["show_plan"] = [repr.__dict__() for repr in state_to_json["show_plan"]]
|
state_to_json["show_plan"] = [repr.__dict__ for repr in state_to_json["show_plan"]]
|
||||||
|
|
||||||
file.write(json.dumps(state_to_json, indent=2, sort_keys=True))
|
file.write(json.dumps(state_to_json, indent=2, sort_keys=True))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue