Example #1
0
    def get_data(self) -> OutputUrls:
        urls = OutputUrls()
        for url in self.data['urls']:
            urls.urls.append(OutputUrl(url['id'], url['uri'],
                                       url['http_root']))

        return urls
Example #2
0
 def make_stream(cls, settings):
     stream = cls()
     stream._settings = settings
     stream.input = InputUrls(urls=[InputUrl(id=InputUrl.generate_id())])
     stream.output = OutputUrls(
         urls=[OutputUrl(id=OutputUrl.generate_id())])
     return stream
Example #3
0
 def make_stream(cls, settings):
     stream = cls()
     stream._settings = settings
     stream.visible = False
     stream.input = InputUrls(urls=[InputUrl(id=InputUrl.generate_id())])
     stream.output = OutputUrls(urls=[OutputUrl(id=OutputUrl.generate_id(), uri=constants.DEFAULT_TEST_URL)])
     return stream
Example #4
0
class IStream(Document):
    meta = {
        'collection': 'streams',
        'allow_inheritance': True,
        'auto_create_index': True
    }

    created_date = DateTimeField(default=datetime.now)  # for inner use
    name = StringField(default=constants.DEFAULT_STREAM_NAME,
                       max_length=constants.MAX_STREAM_NAME_LENGTH,
                       min_length=constants.MIN_STREAM_NAME_LENGTH,
                       required=True)
    group = StringField(default=constants.DEFAULT_STREAM_GROUP_TITLE,
                        max_length=constants.MAX_STREAM_GROUP_TITLE_LENGTH,
                        min_length=constants.MIN_STREAM_GROUP_TITLE_LENGTH,
                        required=True)

    tvg_id = StringField(default=constants.DEFAULT_STREAM_TVG_ID,
                         max_length=constants.MAX_STREAM_TVG_ID_LENGTH,
                         min_length=constants.MIN_STREAM_TVG_ID_LENGTH,
                         required=True)
    tvg_name = StringField(default=constants.DEFAULT_STREAM_TVG_NAME,
                           max_length=constants.MAX_STREAM_NAME_LENGTH,
                           min_length=constants.MIN_STREAM_NAME_LENGTH,
                           required=True)  #
    tvg_logo = StringField(default=constants.DEFAULT_STREAM_ICON_URL,
                           max_length=constants.MAX_URL_LENGTH,
                           min_length=constants.MIN_URL_LENGTH,
                           required=True)  #

    price = FloatField(default=0.0,
                       min_value=constants.MIN_PRICE,
                       max_value=constants.MAX_PRICE,
                       required=True)

    output = EmbeddedDocumentField(OutputUrls, default=OutputUrls())  #

    def get_groups(self) -> list:
        return self.group.split(';')

    def to_dict(self) -> dict:
        return {
            StreamFields.NAME: self.name,
            StreamFields.ID: self.get_id(),
            StreamFields.TYPE: self.get_type(),
            StreamFields.ICON: self.tvg_logo,
            StreamFields.PRICE: self.price,
            StreamFields.GROUP: self.group
        }

    def __init__(self, *args, **kwargs):
        super(IStream, self).__init__(*args, **kwargs)
        self._settings = None

    def set_server_settings(self, settings):
        self._settings = settings

    def get_type(self):
        raise NotImplementedError('subclasses must override get_type()!')

    def get_id(self) -> str:
        return str(self.id)

    def config(self) -> dict:
        return {
            ConfigFields.ID_FIELD: self.get_id(),  # required
            ConfigFields.TYPE_FIELD: self.get_type(),  # required
            ConfigFields.OUTPUT_FIELD:
            self.output.to_mongo()  # required empty in timeshift_record
        }

    def fixup_output_urls(self):
        return

    def reset(self):
        return

    def generate_playlist(self, header=True) -> str:
        result = '#EXTM3U\n' if header else ''
        stream_type = self.get_type()
        if stream_type == constants.StreamType.RELAY or \
                stream_type == constants.StreamType.ENCODE or \
                stream_type == constants.StreamType.TIMESHIFT_PLAYER or \
                stream_type == constants.StreamType.VOD_ENCODE or \
                stream_type == constants.StreamType.VOD_RELAY or \
                stream_type == constants.StreamType.COD_ENCODE or \
                stream_type == constants.StreamType.COD_RELAY or \
                stream_type == constants.StreamType.PROXY:
            for out in self.output.urls:
                result += '#EXTINF:-1 tvg-id="{0}" tvg-name="{1}" tvg-logo="{2}" group-title="{3}",{4}\n{5}\n'.format(
                    self.tvg_id, self.tvg_name, self.tvg_logo, self.group,
                    self.name, out.uri)

        return result

    def generate_device_playlist(self,
                                 uid: str,
                                 passwd: str,
                                 did: str,
                                 lb_server_host_and_port: str,
                                 header=True) -> str:
        result = '#EXTM3U\n' if header else ''
        stream_type = self.get_type()
        if stream_type == constants.StreamType.PROXY or \
                stream_type == constants.StreamType.VOD_PROXY or \
                stream_type == constants.StreamType.RELAY or \
                stream_type == constants.StreamType.ENCODE or \
                stream_type == constants.StreamType.TIMESHIFT_PLAYER or \
                stream_type == constants.StreamType.VOD_ENCODE or \
                stream_type == constants.StreamType.VOD_RELAY or \
                stream_type == constants.StreamType.COD_ENCODE or \
                stream_type == constants.StreamType.COD_RELAY:
            for out in self.output.urls:
                parsed_uri = urlparse(out.uri)
                if parsed_uri.scheme == 'http' or parsed_uri.scheme == 'https':
                    file_name = os.path.basename(parsed_uri.path)
                    url = 'http://{0}/{1}/{2}/{3}/{4}/{5}/{6}'.format(
                        lb_server_host_and_port, uid, passwd, did, self.id,
                        out.id, file_name)
                    result += '#EXTINF:-1 tvg-id="{0}" tvg-name="{1}" tvg-logo="{2}" group-title="{3}",{4}\n{5}\n'.format(
                        self.tvg_id, self.tvg_name, self.tvg_logo, self.group,
                        self.name, url)

        return result

    def generate_input_playlist(self, header=True) -> str:
        raise NotImplementedError(
            'subclasses must override generate_input_playlist()!')

    def save(self, *args, **kwargs):
        super(IStream, self).save(*args, **kwargs)
        self.fixup_output_urls()
        return super(IStream, self).save(*args, **kwargs)