2020-04-15 20:29:59 +02:00
|
|
|
from django.db import models
|
2020-04-29 18:48:23 +02:00
|
|
|
from django.urls import reverse
|
2020-04-23 20:19:49 +02:00
|
|
|
from django.utils.translation import gettext as _
|
2020-04-15 20:29:59 +02:00
|
|
|
import uuid
|
|
|
|
|
|
|
|
from . import signals
|
|
|
|
|
2020-04-20 14:51:44 +02:00
|
|
|
|
2020-04-15 20:29:59 +02:00
|
|
|
class Application(models.Model):
|
2020-04-23 21:08:39 +02:00
|
|
|
name = models.CharField(max_length=100, unique=True, help_text=_("rtmp_application_name"))
|
2020-04-15 20:29:59 +02:00
|
|
|
|
2020-04-29 18:48:23 +02:00
|
|
|
def class_name(self):
|
|
|
|
return self.__class__.__name__
|
|
|
|
|
2020-04-15 20:29:59 +02:00
|
|
|
def __str__(self):
|
|
|
|
return self.name
|
|
|
|
|
|
|
|
|
2020-04-23 21:08:39 +02:00
|
|
|
class Stream(models.Model):
|
2020-04-15 20:29:59 +02:00
|
|
|
application = models.ForeignKey(Application, on_delete=models.CASCADE)
|
2020-04-26 22:25:58 +02:00
|
|
|
stream = models.UUIDField(unique=True, default=uuid.uuid4)
|
2020-04-15 20:29:59 +02:00
|
|
|
name = models.CharField(max_length=100)
|
|
|
|
|
2020-04-26 19:46:58 +02:00
|
|
|
# the same stream uuid can be published multiple times to different origin
|
|
|
|
# servers. this is a valid scheme to achieve a failover on the origin layer.
|
|
|
|
# thus we need to keep track if a stream is published at least once,
|
|
|
|
# and only send signals when we are going to / coming from 0 published streams.
|
|
|
|
publish_counter = models.PositiveIntegerField(default=0)
|
|
|
|
|
2020-04-23 21:08:39 +02:00
|
|
|
def on_publish(self, param):
|
2020-04-26 19:46:58 +02:00
|
|
|
# if so far there were less than one incoming streams, this stream
|
|
|
|
# is now being considered active
|
|
|
|
if self.publish_counter < 1:
|
|
|
|
signals.stream_active.send(sender=self.__class__,
|
2020-04-26 22:25:58 +02:00
|
|
|
stream=str(self.stream),
|
2020-04-26 19:46:58 +02:00
|
|
|
param=param
|
|
|
|
)
|
|
|
|
|
|
|
|
# keep track of this incoming stream
|
|
|
|
self.publish_counter += 1
|
|
|
|
self.save()
|
2020-04-15 20:29:59 +02:00
|
|
|
|
2020-04-23 21:08:39 +02:00
|
|
|
def on_unpublish(self, param):
|
2020-04-26 19:46:58 +02:00
|
|
|
# note that we now have on less incoming stream
|
|
|
|
if self.publish_counter > 0:
|
|
|
|
self.publish_counter -= 1
|
|
|
|
|
|
|
|
# if we now have less than one incoming stream, this stream is being
|
|
|
|
# considered inactive
|
|
|
|
if self.publish_counter < 1:
|
|
|
|
signals.stream_inactive.send(sender=self.__class__,
|
2020-04-26 22:25:58 +02:00
|
|
|
stream=str(self.stream),
|
2020-04-26 19:46:58 +02:00
|
|
|
param=param
|
|
|
|
)
|
|
|
|
self.save()
|
2020-04-15 20:29:59 +02:00
|
|
|
|
2020-04-29 18:48:23 +02:00
|
|
|
def get_absolute_url(self):
|
|
|
|
return reverse('rtmp:stream_detail', kwargs={'pk': self.pk})
|
|
|
|
|
|
|
|
def class_name(self):
|
|
|
|
return self.__class__.__name__
|
|
|
|
|
2020-04-15 20:29:59 +02:00
|
|
|
def __str__(self):
|
2020-04-23 21:08:39 +02:00
|
|
|
return self.name
|