def dumps(self, last_segment): output = [] if last_segment and self.key != last_segment.key: output.append(str(self.key)) output.append('\n') else: # The key must be checked anyway now for the first segment if self.key and last_segment is None: output.append(str(self.key)) output.append('\n') if self.discontinuity: output.append('#EXT-X-DISCONTINUITY\n') if self.program_date_time: output.append('#EXT-X-PROGRAM-DATE-TIME:%s\n' % format_date_time(self.program_date_time)) if self.cue_out: output.append('#EXT-X-CUE-OUT-CONT\n') output.append('#EXTINF:%s,' % int_or_float_to_string(self.duration)) if self.title: output.append(quoted(self.title)) output.append('\n') if self.byterange: output.append('#EXT-X-BYTERANGE:%s\n' % self.byterange) output.append(self.uri) return ''.join(output)
def dumps(self): ''' Returns the current m3u8 as a string. You could also use unicode(<this obj>) or str(<this obj>) ''' output = ['#EXTM3U'] if self.is_independent_segments: output.append('#EXT-X-INDEPENDENT-SEGMENTS') if self.media_sequence: output.append('#EXT-X-MEDIA-SEQUENCE:' + str(self.media_sequence)) if self.allow_cache: output.append('#EXT-X-ALLOW-CACHE:' + self.allow_cache.upper()) if self.version: output.append('#EXT-X-VERSION:' + self.version) if self.target_duration: output.append('#EXT-X-TARGETDURATION:' + int_or_float_to_string(self.target_duration)) if self.program_date_time is not None: output.append('#EXT-X-PROGRAM-DATE-TIME:' + format_date_time(self.program_date_time)) if not (self.playlist_type is None or self.playlist_type == ''): output.append('#EXT-X-PLAYLIST-TYPE:%s' % str(self.playlist_type).upper()) if self.is_i_frames_only: output.append('#EXT-X-I-FRAMES-ONLY') if self.is_variant: if self.media: output.append(str(self.media)) output.append(str(self.playlists)) if self.iframe_playlists: output.append(str(self.iframe_playlists)) output.append(str(self.segments)) if self.is_endlist: output.append('#EXT-X-ENDLIST') return '\n'.join(output)
def dumps(self, last_segment=None): output = [] if not last_segment and self.key is not None: output.append(str(self.key)) output.append('\n') elif last_segment and self.key != last_segment.key: output.append(str(self.key)) output.append('\n') if self.discontinuity: output.append('#EXT-X-DISCONTINUITY\n') if self.program_date_time: output.append('#EXT-X-PROGRAM-DATE-TIME:%s\n' % parser.format_date_time(self.program_date_time)) if self.cue_out: output.append('#EXT-X-CUE-OUT-CONT\n') output.append('#EXTINF:%s,' % int_or_float_to_string(self.duration)) if self.title: output.append(quoted(self.title)) output.append('\n') if self.byterange: output.append('#EXT-X-BYTERANGE:%s\n' % self.byterange) output.append(self.uri) return ''.join(output)
def dumps(self): ''' Returns the current m3u8 as a string. You could also use unicode(<this obj>) or str(<this obj>) ''' output = ['#EXTM3U'] if self.media_sequence > 0: output.append('#EXT-X-MEDIA-SEQUENCE:' + str(self.media_sequence)) if self.allow_cache: output.append('#EXT-X-ALLOW-CACHE:' + self.allow_cache.upper()) if self.version: output.append('#EXT-X-VERSION:' + self.version) if self.key: output.append(str(self.key)) if self.target_duration: output.append('#EXT-X-TARGETDURATION:' + int_or_float_to_string(self.target_duration)) if self.program_date_time is not None: output.append('#EXT-X-PROGRAM-DATE-TIME:' + parser.format_date_time(self.program_date_time)) if not (self.playlist_type is None or self.playlist_type == ''): output.append( '#EXT-X-PLAYLIST-TYPE:%s' % str(self.playlist_type).upper()) if self.is_i_frames_only: output.append('#EXT-X-I-FRAMES-ONLY') if self.is_variant: for media in self.media: media_out = [] if media.uri: media_out.append('URI=' + quoted(media.uri)) if media.type: media_out.append('TYPE=' + media.type) if media.group_id: media_out.append('GROUP-ID=' + quoted(media.group_id)) if media.language: media_out.append('LANGUAGE=' + quoted(media.language)) if media.name: media_out.append('NAME=' + quoted(media.name)) if media.default: media_out.append('DEFAULT=' + media.default) if media.autoselect: media_out.append('AUTOSELECT=' + media.autoselect) if media.forced: media_out.append('FORCED=' + media.forced) if media.characteristics: media_out.append('CHARACTERISTICS=' + quoted(media.characteristics)) output.append('#EXT-X-MEDIA:' + ','.join(media_out)) output.append(str(self.playlists)) if self.iframe_playlists: output.append(str(self.iframe_playlists)) output.append(str(self.segments)) if self.is_endlist: output.append('#EXT-X-ENDLIST') return '\n'.join(output)
def dumps(self, last_segment): output = [] if last_segment and self.key != last_segment.key: output.append(str(self.key)) output.append('\n') else: # The key must be checked anyway now for the first segment if self.key and last_segment is None: output.append(str(self.key)) output.append('\n') if last_segment and self.init_section != last_segment.init_section: if not self.init_section: raise MalformedPlaylistError( "init section can't be None if previous is not None") output.append(str(self.init_section)) output.append('\n') else: if self.init_section and last_segment is None: output.append(str(self.init_section)) output.append('\n') if self.discontinuity: output.append('#EXT-X-DISCONTINUITY\n') if self.program_date_time: output.append('#EXT-X-PROGRAM-DATE-TIME:%s\n' % format_date_time(self.program_date_time)) if self.cue_out_start: output.append('#EXT-X-CUE-OUT{}\n'.format( (':' + self.scte35_duration) if self.scte35_duration else '')) elif self.cue_out: output.append('#EXT-X-CUE-OUT-CONT\n') if self.cue_in: output.append('#EXT-X-CUE-IN\n') if self.parts: output.append(str(self.parts)) output.append('\n') if self.uri: if self.duration is not None: output.append('#EXTINF:%s,' % int_or_float_to_string(self.duration)) if self.title: output.append(self.title) output.append('\n') if self.byterange: output.append('#EXT-X-BYTERANGE:%s\n' % self.byterange) output.append(self.uri) return ''.join(output)
def dumps(self): ''' Returns the current m3u8 as a string. You could also use unicode(<this obj>) or str(<this obj>) ''' output = ['#EXTM3U'] if self.is_independent_segments: output.append('#EXT-X-INDEPENDENT-SEGMENTS') if self.media_sequence: output.append('#EXT-X-MEDIA-SEQUENCE:' + str(self.media_sequence)) if self.discontinuity_sequence: output.append('#EXT-X-DISCONTINUITY-SEQUENCE:{}'.format( int_or_float_to_string(self.discontinuity_sequence))) if self.allow_cache: output.append('#EXT-X-ALLOW-CACHE:' + self.allow_cache.upper()) if self.version: output.append('#EXT-X-VERSION:' + self.version) if self.target_duration: output.append('#EXT-X-TARGETDURATION:' + int_or_float_to_string(self.target_duration)) if self.program_date_time is not None: output.append('#EXT-X-PROGRAM-DATE-TIME:' + format_date_time(self.program_date_time)) if not (self.playlist_type is None or self.playlist_type == ''): output.append('#EXT-X-PLAYLIST-TYPE:%s' % str(self.playlist_type).upper()) if self.start: output.append(str(self.start)) if self.is_i_frames_only: output.append('#EXT-X-I-FRAMES-ONLY') if self.segment_map: map_output = [] if self.segment_map.get('uri'): map_output.append('URI=' + quoted(self.segment_map['uri'])) if self.segment_map.get('byterange'): map_output.append('BYTERANGE=' + self.segment_map['byterange']) output.append('#EXT-X-MAP:' + ','.join(map_output)) if self.is_variant: if self.media: output.append(str(self.media)) output.append(str(self.playlists)) if self.iframe_playlists: output.append(str(self.iframe_playlists)) output.append(str(self.segments)) if self.is_endlist: output.append('#EXT-X-ENDLIST') return '\n'.join(output)
def dumps_lines(self, last_segment=None): if last_segment: if self.key != last_segment.key: yield str(self.key) if self.discontinuity: yield '#EXT-X-DISCONTINUITY' if self.program_date_time: yield '#EXT-X-PROGRAM-DATE-TIME:%s' % parser.format_date_time(self.program_date_time) if self.cue_out: yield '#EXT-X-CUE-OUT-CONT' yield '#EXTINF:%s,%s' % (int_or_float_to_string(self.duration), quoted(self.title) if self.title else '') if self.byterange: yield '#EXT-X-BYTERANGE:%s' % self.byterange yield self.uri yield ''
def dumps(self): ''' Returns the current m3u8 as a string. You could also use unicode(<this obj>) or str(<this obj>) ''' output = ['#EXTM3U'] if self.is_independent_segments: output.append('#EXT-X-INDEPENDENT-SEGMENTS') if self.media_sequence: output.append('#EXT-X-MEDIA-SEQUENCE:' + str(self.media_sequence)) if self.allow_cache: output.append('#EXT-X-ALLOW-CACHE:' + self.allow_cache.upper()) if self.version: output.append('#EXT-X-VERSION:' + self.version) if self.key: output.append(str(self.key)) if self.target_duration: output.append('#EXT-X-TARGETDURATION:' + int_or_float_to_string(self.target_duration)) if self.program_date_time is not None: output.append('#EXT-X-PROGRAM-DATE-TIME:' + parser.format_date_time(self.program_date_time)) if not (self.playlist_type is None or self.playlist_type == ''): output.append('#EXT-X-PLAYLIST-TYPE:%s' % str(self.playlist_type).upper()) if self.is_i_frames_only: output.append('#EXT-X-I-FRAMES-ONLY') if self.is_variant: if self.media: output.append(str(self.media)) output.append(str(self.playlists)) if self.iframe_playlists: output.append(str(self.iframe_playlists)) output.append(str(self.segments)) if self.is_endlist: output.append('#EXT-X-ENDLIST') return '\n'.join(output)
def dumps(self, last_segment): output = [] if last_segment and self.key != last_segment.key: output.append(str(self.key)) output.append('\n') else: # The key must be checked anyway now for the first segment if self.key and last_segment is None: output.append(str(self.key)) output.append('\n') if self.discontinuity: output.append('#EXT-X-DISCONTINUITY\n') if self.program_date_time: output.append('#EXT-X-PROGRAM-DATE-TIME:%s\n' % format_date_time(self.program_date_time)) if self.cue_out: output.append('#EXT-X-CUE-OUT-CONT\n') if self.parts: output.append(str(self.parts)) output.append('\n') if self.uri: if self.duration is not None: output.append('#EXTINF:%s,' % int_or_float_to_string(self.duration)) if self.title: output.append(self.title) output.append('\n') if self.byterange: output.append('#EXT-X-BYTERANGE:%s\n' % self.byterange) output.append(self.uri) return ''.join(output)
def dumps(self, last_segment): output = [] if last_segment and self.key != last_segment.key: output.append(str(self.key)) output.append('\n') if self.discontinuity: output.append('#EXT-X-DISCONTINUITY\n') output.append('#EXT-X-PROGRAM-DATE-TIME:%s\n' % parser.format_date_time(self.program_date_time)) output.append('#EXTINF:%s,' % int_or_float_to_string(self.duration)) if self.title: output.append(quoted(self.title)) output.append('\n') if self.byterange: output.append('#EXT-X-BYTERANGE:%s\n' % self.byterange) output.append(self.uri) return ''.join(output)
def dumps_lines(self): ''' Returns the current m3u8 as a sequence of lines. ''' yield ['#EXTM3U'] if self.is_independent_segments: yield '#EXT-X-INDEPENDENT-SEGMENTS' if self.media_sequence > 0: yield '#EXT-X-MEDIA-SEQUENCE:' + str(self.media_sequence) if self.allow_cache: yield '#EXT-X-ALLOW-CACHE:' + self.allow_cache.upper() if self.version: yield '#EXT-X-VERSION:' + self.version if self.target_duration: yield '#EXT-X-TARGETDURATION:' + int_or_float_to_string(self.target_duration) if self.program_date_time is not None: yield '#EXT-X-PROGRAM-DATE-TIME:' + parser.format_date_time(self.program_date_time) if not (self.playlist_type is None or self.playlist_type == ''): yield '#EXT-X-PLAYLIST-TYPE:%s' % str(self.playlist_type).upper() if self.is_i_frames_only: yield '#EXT-X-I-FRAMES-ONLY' if self.is_variant: if self.media: yield str(self.media) yield str(self.playlists) if self.iframe_playlists: yield str(self.iframe_playlists) currentKey = None for segment in self.segments: yield segment.toStr(currentKey) currentKey = segment.key currentKey = None if self.is_endlist: yield '#EXT-X-ENDLIST'
def dumps(self, last_segment): output = [] if last_segment and self.key != last_segment.key: output.append(str(self.key)) output.append('\n') else: # The key must be checked anyway now for the first segment if self.key and last_segment is None: output.append(str(self.key)) output.append('\n') if last_segment and self.init_section != last_segment.init_section: if not self.init_section: raise MalformedPlaylistError( "init section can't be None if previous is not None") output.append(str(self.init_section)) output.append('\n') else: if self.init_section and last_segment is None: output.append(str(self.init_section)) output.append('\n') if self.discontinuity: output.append('#EXT-X-DISCONTINUITY\n') if self.program_date_time: output.append('#EXT-X-PROGRAM-DATE-TIME:%s\n' % format_date_time(self.program_date_time)) if len(self.dateranges): output.append(str(self.dateranges)) output.append('\n') if self.cue_out_start: output.append('#EXT-X-CUE-OUT{}\n'.format( (':' + self.scte35_duration) if self.scte35_duration else '')) elif self.cue_out: output.append('#EXT-X-CUE-OUT-CONT\n') if self.cue_in: output.append('#EXT-X-CUE-IN\n') if self.parts: output.append(str(self.parts)) output.append('\n') if self.uri: if self.extra_tags: for tag in self.extra_tags: output.append(tag) output.append('\n') if self.duration is not None: output.append('#EXTINF:%s,' % number_to_string(self.duration)) if self.channel_number: output.append('%s - ' % number_to_string(self.channel_number)) if self.title: output.append(self.title) output.append('\n') if self.icon_url is not None or self.xmltv_id is not None or self.language is not None or len(self.tags) > 0: #EXTTV:tag[,tag,tag...];language;XMLTV id[;icon URL] output.append('#EXTTV:%s;%s;%s' % ( ",".join(self.tags), self.language if self.language is not None else "", self.xmltv_id if self.xmltv_id is not None else "" )) if self.icon_url is not None: output.append(';%s' % self.icon_url) output.append('\n') if self.byterange: output.append('#EXT-X-BYTERANGE:%s\n' % self.byterange) if self.gap_tag: output.append('#EXT-X-GAP\n') output.append(self.uri) return ''.join(output)
def dumps(self, last_segment): output = [] if last_segment and self.key != last_segment.key: output.append(str(self.key)) output.append('\n') else: # The key must be checked anyway now for the first segment if self.key and last_segment is None: output.append(str(self.key)) output.append('\n') if last_segment and self.init_section != last_segment.init_section: if not self.init_section: raise MalformedPlaylistError( "init section can't be None if previous is not None") output.append(str(self.init_section)) output.append('\n') else: if self.init_section and last_segment is None: output.append(str(self.init_section)) output.append('\n') if self.discontinuity: output.append('#EXT-X-DISCONTINUITY\n') if self.program_date_time: output.append('#EXT-X-PROGRAM-DATE-TIME:%s\n' % format_date_time(self.program_date_time)) if len(self.dateranges): output.append(str(self.dateranges)) output.append('\n') if self.cue_out_start: output.append('#EXT-X-CUE-OUT{}\n'.format(( ':' + self.scte35_duration) if self.scte35_duration else '')) elif self.cue_out: output.append('#EXT-X-CUE-OUT-CONT\n') if self.cue_in: output.append('#EXT-X-CUE-IN\n') if self.parts: output.append(str(self.parts)) output.append('\n') if self.uri: if self.duration is not None: props_dumped = '' if self.additional_props: props_dumped = ' '.join( '{0}="{1}"'.format(key, value) for key, value in self.additional_props.items()) props_dumped = " {0}".format(props_dumped) output.append('#EXTINF:%s%s,' % (number_to_string(self.duration), props_dumped)) if self.title: output.append(self.title) output.append('\n') if self.byterange: output.append('#EXT-X-BYTERANGE:%s\n' % self.byterange) if self.gap_tag: output.append('#EXT-X-GAP\n') if self.grp: output.append("{}:{}\n".format(extgrp, self.grp)) if self.vlcopt: for item in self.vlcopt: output.append("{}:{}\n".format(extvlcopt, item)) output.append(self.uri) return ''.join(output)