1 from __future__ import absolute_import
4 def normalize_stream(stream_name, stream):
5 """Take manifest stream and return a list of tokens in normalized format.
8 The name of the stream.
11 A dict mapping each filename to a list of `_range.LocatorAndRange` objects.
15 stream_name = stream_name.replace(' ', '\\040')
16 stream_tokens = [stream_name]
17 sortedfiles = list(stream.keys())
22 # Go through each file and add each referenced block exactly once.
23 for streamfile in sortedfiles:
24 for segment in stream[streamfile]:
25 if segment.locator not in blocks:
26 stream_tokens.append(segment.locator)
27 blocks[segment.locator] = streamoffset
28 streamoffset += segment.block_size
30 # Add the empty block if the stream is otherwise empty.
31 if len(stream_tokens) == 1:
32 stream_tokens.append(config.EMPTY_BLOCK_LOCATOR)
34 for streamfile in sortedfiles:
35 # Add in file segments
37 fout = streamfile.replace(' ', '\\040')
38 for segment in stream[streamfile]:
39 # Collapse adjacent segments
40 streamoffset = blocks[segment.locator] + segment.segment_offset
41 if current_span is None:
42 current_span = [streamoffset, streamoffset + segment.segment_size]
44 if streamoffset == current_span[1]:
45 current_span[1] += segment.segment_size
47 stream_tokens.append("{0}:{1}:{2}".format(current_span[0], current_span[1] - current_span[0], fout))
48 current_span = [streamoffset, streamoffset + segment.segment_size]
50 if current_span is not None:
51 stream_tokens.append("{0}:{1}:{2}".format(current_span[0], current_span[1] - current_span[0], fout))
53 if not stream[streamfile]:
54 stream_tokens.append("0:0:{0}".format(fout))