mirror of
				https://github.com/devine-dl/devine.git
				synced 2025-11-04 03:44:49 +00:00 
			
		
		
		
	HLS: Only merge relevant segments on discontinuity
This commit is contained in:
		
							parent
							
								
									2388c85894
								
							
						
					
					
						commit
						506ba0f615
					
				@ -364,20 +364,35 @@ class HLS:
 | 
			
		||||
 | 
			
		||||
                return decrypted_path
 | 
			
		||||
 | 
			
		||||
            def merge_discontinuity():
 | 
			
		||||
                """Merge all files in the segment save directory so far."""
 | 
			
		||||
                files = list(sorted(segment_save_dir.iterdir()))
 | 
			
		||||
            def merge_discontinuity(include_this_segment: bool):
 | 
			
		||||
                """
 | 
			
		||||
                Merge all segments of the discontinuity.
 | 
			
		||||
 | 
			
		||||
                to_dir = segment_save_dir.parent
 | 
			
		||||
                to_path = to_dir / f"{str(discon_i).zfill(name_len)}{files[-1].suffix}"
 | 
			
		||||
                All segment files for this discontinuity must already be downloaded and
 | 
			
		||||
                already decrypted (if it needs to be decrypted).
 | 
			
		||||
 | 
			
		||||
                merge(
 | 
			
		||||
                    to=to_path,
 | 
			
		||||
                    via=files,
 | 
			
		||||
                    delete=True,
 | 
			
		||||
                    include_map_data=True
 | 
			
		||||
                )
 | 
			
		||||
                segment_save_dir.rmdir()
 | 
			
		||||
                Parameters:
 | 
			
		||||
                    include_this_segment: Whether to include the current segment in the
 | 
			
		||||
                        list of segments to merge and decrypt. This should be False if
 | 
			
		||||
                        decrypting on EXT-X-KEY changes, or True when decrypting on the
 | 
			
		||||
                        last segment.
 | 
			
		||||
                """
 | 
			
		||||
                last_segment_i = max(0, i - int(not include_this_segment))
 | 
			
		||||
 | 
			
		||||
                files = [
 | 
			
		||||
                    file
 | 
			
		||||
                    for file in sorted(segment_save_dir.iterdir())
 | 
			
		||||
                    if int(file.stem.replace("_decrypted", "").split("-")[-1]) <= last_segment_i
 | 
			
		||||
                ]
 | 
			
		||||
                if files:
 | 
			
		||||
                    to_dir = segment_save_dir.parent
 | 
			
		||||
                    to_path = to_dir / f"{str(discon_i).zfill(name_len)}{files[-1].suffix}"
 | 
			
		||||
                    merge(
 | 
			
		||||
                        to=to_path,
 | 
			
		||||
                        via=files,
 | 
			
		||||
                        delete=True,
 | 
			
		||||
                        include_map_data=True
 | 
			
		||||
                    )
 | 
			
		||||
 | 
			
		||||
            if isinstance(track, Subtitle):
 | 
			
		||||
                segment_data = try_ensure_utf8(segment_file_path.read_bytes())
 | 
			
		||||
@ -392,7 +407,7 @@ class HLS:
 | 
			
		||||
            if segment.discontinuity and i != 0:
 | 
			
		||||
                if encryption_data:
 | 
			
		||||
                    decrypt(include_this_segment=False)
 | 
			
		||||
                merge_discontinuity()
 | 
			
		||||
                merge_discontinuity(include_this_segment=False)
 | 
			
		||||
 | 
			
		||||
                discon_i += 1
 | 
			
		||||
                range_offset = 0  # TODO: Should this be reset or not?
 | 
			
		||||
@ -446,7 +461,7 @@ class HLS:
 | 
			
		||||
                # required as it won't end with EXT-X-DISCONTINUITY nor a new key
 | 
			
		||||
                if encryption_data:
 | 
			
		||||
                    decrypt(include_this_segment=True)
 | 
			
		||||
                merge_discontinuity()
 | 
			
		||||
                merge_discontinuity(include_this_segment=True)
 | 
			
		||||
 | 
			
		||||
            progress(advance=1)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user