mirror of
https://github.com/fastogt/fastocloud_admin.git
synced 2025-03-09 23:38:52 +00:00
Add subscribers
This commit is contained in:
parent
7c178982f5
commit
6bfd6b4774
6 changed files with 94 additions and 29 deletions
|
@ -54,7 +54,7 @@ class Service(IStreamHandler):
|
|||
self._settings = settings
|
||||
self.__reload_from_db()
|
||||
# other fields
|
||||
self._client = ServiceClient(self, settings)
|
||||
self._client = ServiceClient(settings.id, self, settings)
|
||||
self._host = host
|
||||
self._port = port
|
||||
self._socketio = socketio
|
||||
|
@ -69,7 +69,7 @@ class Service(IStreamHandler):
|
|||
return self._client.stop_service(delay)
|
||||
|
||||
def get_log_service(self):
|
||||
return self._client.get_log_service(self._host, self._port, self.id)
|
||||
return self._client.get_log_service(self._host, self._port)
|
||||
|
||||
def ping(self):
|
||||
return self._client.ping_service()
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
from bson.objectid import ObjectId
|
||||
|
||||
from app.client.client import Client
|
||||
from app.client.client_handler import IClientHandler
|
||||
from app.client.json_rpc import Request, Response
|
||||
|
@ -27,7 +29,8 @@ class ServiceClient(IClientHandler):
|
|||
def get_pipeline_stream_path(host: str, port: int, stream_id: str):
|
||||
return constants.DEFAULT_STREAM_PIPELINE_PATH_TEMPLATE_3SIS.format(host, port, stream_id)
|
||||
|
||||
def __init__(self, handler: IStreamHandler, settings: ServiceSettings):
|
||||
def __init__(self, sid: ObjectId, handler: IStreamHandler, settings: ServiceSettings):
|
||||
self.id = sid
|
||||
self._request_id = 0
|
||||
self._handler = handler
|
||||
self._service_settings = settings
|
||||
|
@ -52,8 +55,9 @@ class ServiceClient(IClientHandler):
|
|||
def stop_service(self, delay: int):
|
||||
return self._client.stop_service(self._gen_request_id(), delay)
|
||||
|
||||
def get_log_service(self, host: str, port: int, sid: str):
|
||||
return self._client.get_log_service(self._gen_request_id(), ServiceClient.get_log_service_path(host, port, sid))
|
||||
def get_log_service(self, host: str, port: int):
|
||||
return self._client.get_log_service(self._gen_request_id(),
|
||||
ServiceClient.get_log_service_path(host, port, str(self.id)))
|
||||
|
||||
def start_stream(self, config: dict):
|
||||
return self._client.start_stream(self._gen_request_id(), config)
|
||||
|
@ -78,8 +82,9 @@ class ServiceClient(IClientHandler):
|
|||
streams.append(stream.config())
|
||||
|
||||
subscribers = []
|
||||
for subscriber in self._service_settings.subscribers:
|
||||
subscribers.append(subscriber.to_service())
|
||||
for subs in self._service_settings.subscribers:
|
||||
subscribers.append(subs.to_service(self.id))
|
||||
|
||||
return self._client.sync_service(self._gen_request_id(), streams, subscribers)
|
||||
|
||||
def get_http_host(self) -> str:
|
||||
|
|
|
@ -61,3 +61,10 @@ class ServiceSettings(Document, ServerSettings):
|
|||
self.subscribers.remove(subscriber)
|
||||
break
|
||||
self.save()
|
||||
|
||||
def find_stream_settings_by_id(self, sid):
|
||||
for stream in self.streams:
|
||||
if stream.id == sid:
|
||||
return stream
|
||||
|
||||
return None
|
||||
|
|
|
@ -167,10 +167,9 @@ class ServiceView(FlaskView):
|
|||
server = ServiceSettings.objects(id=sid).first()
|
||||
if server:
|
||||
new_entry = form.make_entry()
|
||||
new_entry.save()
|
||||
|
||||
server.add_subscriber(new_entry.id)
|
||||
new_entry.add_server(server)
|
||||
|
||||
server.add_subscriber(new_entry)
|
||||
return jsonify(status='ok'), 200
|
||||
|
||||
return render_template('service/subscriber/add.html', form=form)
|
||||
|
|
|
@ -65,6 +65,46 @@ class StreamFields:
|
|||
TIMESTAMP = 'timestamp'
|
||||
|
||||
|
||||
class EpgInfo:
|
||||
ID_FIELD = 'id'
|
||||
URL_FIELD = 'url'
|
||||
TITLE_FIELD = 'display_name'
|
||||
ICON_FIELD = 'icon'
|
||||
PROGRAMS_FIELD = 'programs'
|
||||
|
||||
id = str
|
||||
url = str
|
||||
title = str
|
||||
icon = str
|
||||
programs = []
|
||||
|
||||
def __init__(self, eid: str, url: str, title: str, icon: str, programs=list()):
|
||||
self.id = eid
|
||||
self.url = url
|
||||
self.title = title
|
||||
self.icon = icon
|
||||
self.programs = programs
|
||||
|
||||
def to_dict(self) -> dict:
|
||||
return {EpgInfo.ID_FIELD: self.id, EpgInfo.URL_FIELD: self.url, EpgInfo.TITLE_FIELD: self.title,
|
||||
EpgInfo.ICON_FIELD: self.icon, EpgInfo.PROGRAMS_FIELD: self.programs}
|
||||
|
||||
|
||||
class ChannelInfo:
|
||||
EPG_FIELD = 'epg'
|
||||
VIDEO_ENABLE_FIELD = 'video'
|
||||
AUDIO_ENABLE_FIELD = 'audio'
|
||||
|
||||
def __init__(self, epg: EpgInfo, have_video=True, have_audio=True):
|
||||
self.have_video = have_video
|
||||
self.have_audio = have_audio
|
||||
self.epg = epg
|
||||
|
||||
def to_dict(self) -> dict:
|
||||
return {ChannelInfo.EPG_FIELD: self.epg.to_dict(), ChannelInfo.VIDEO_ENABLE_FIELD: self.have_video,
|
||||
ChannelInfo.AUDIO_ENABLE_FIELD: self.have_audio}
|
||||
|
||||
|
||||
class Stream(EmbeddedDocument):
|
||||
meta = {'allow_inheritance': True, 'auto_create_index': True}
|
||||
|
||||
|
@ -159,6 +199,13 @@ class Stream(EmbeddedDocument):
|
|||
conf[AUDIO_SELECT_FIELD] = audio_select
|
||||
return conf
|
||||
|
||||
def to_channel_info(self) -> [ChannelInfo]:
|
||||
ch = []
|
||||
for out in self.output.urls:
|
||||
epg = EpgInfo(self.get_id(), out.uri, self.name, self.icon)
|
||||
ch.append(ChannelInfo(epg))
|
||||
return ch
|
||||
|
||||
def generate_feedback_dir(self):
|
||||
return '{0}/{1}/{2}'.format(self._settings.feedback_directory, self.get_type(), self.get_id())
|
||||
|
||||
|
|
|
@ -7,7 +7,6 @@ from mongoengine import Document, EmbeddedDocument, StringField, DateTimeField,
|
|||
PULL, ObjectIdField
|
||||
|
||||
from app.service.service_entry import ServiceSettings
|
||||
from app.stream.stream_entry import Stream
|
||||
|
||||
|
||||
class Device(EmbeddedDocument):
|
||||
|
@ -29,7 +28,7 @@ class Subscriber(Document):
|
|||
PASSWORD_FIELD = "password"
|
||||
STATUS_FIELD = "status"
|
||||
DEVICES_FIELD = "devices"
|
||||
STREAMS_FIELD = "streams"
|
||||
STREAMS_FIELD = "channels"
|
||||
|
||||
class Status(IntEnum):
|
||||
NO_ACTIVE = 0
|
||||
|
@ -51,32 +50,38 @@ class Subscriber(Document):
|
|||
type = IntField(default=Type.USER)
|
||||
country = StringField(min_length=2, max_length=3, required=True)
|
||||
servers = ListField(ReferenceField(ServiceSettings, reverse_delete_rule=PULL), default=[])
|
||||
devices = ListField(Device, default=[])
|
||||
streams = ListField(ReferenceField(Stream, reverse_delete_rule=PULL), default=[])
|
||||
devices = ListField(Device(), default=[])
|
||||
streams = ListField(ObjectIdField(), default=[])
|
||||
|
||||
def add_server(self, server: ServiceSettings):
|
||||
self.servers.append(server)
|
||||
self.save()
|
||||
|
||||
def add_stream(self, sid):
|
||||
self.streams.append(sid)
|
||||
def add_stream(self, stream):
|
||||
self.streams.append(stream.id)
|
||||
self.save()
|
||||
|
||||
def remove_stream(self, sid):
|
||||
def remove_stream(self, sid: ObjectId):
|
||||
for stream in self.streams:
|
||||
if stream == sid:
|
||||
self.streams.remove(stream)
|
||||
break
|
||||
self.save()
|
||||
|
||||
def to_service(self) -> dict:
|
||||
def to_service(self, sid: ObjectId) -> dict:
|
||||
for serv in self.servers:
|
||||
if serv.id == sid:
|
||||
devices = []
|
||||
for dev in self.devices:
|
||||
devices.append(str(dev.id))
|
||||
|
||||
streams = []
|
||||
for stream in self.streams:
|
||||
streams.append(str(stream))
|
||||
founded_stream = serv.find_stream_settings_by_id(stream)
|
||||
if founded_stream:
|
||||
channels = founded_stream.to_channel_info()
|
||||
for ch in channels:
|
||||
streams.append(ch.to_dict())
|
||||
|
||||
conf = {
|
||||
Subscriber.ID_FIELD: str(self.id), Subscriber.EMAIL_FIELD: self.email,
|
||||
|
@ -84,6 +89,8 @@ class Subscriber(Document):
|
|||
Subscriber.DEVICES_FIELD: devices, Subscriber.STREAMS_FIELD: streams}
|
||||
return conf
|
||||
|
||||
return {}
|
||||
|
||||
@staticmethod
|
||||
def make_md5_hash_from_password(password: str) -> str:
|
||||
m = md5()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue