Just in case anyone else would have also a need for this.
Below is a little Python script that generates the *.ssif files from the *.m2ts files using the *.ssif.smap files:
Code: Select all
#!/usr/bin/python3
import sys
import os
import argparse
import re
smap_file_header = "# SSIF MAP FILE v1\n"
default_maximum_read_size = 1024**2
def main():
    #parse command arguments
    parser = argparse.ArgumentParser(allow_abbrev=False)
    parser.add_argument("smap_files", type=str, nargs="+", help="The SMAP-files for which – using the M2TS-files listed therein – the SSIF-files shall be generated in the working directory.", metavar="FILENAME")
    
    args = parser.parse_args()
    
    
    #process SMAP-file operands
    for smap_filename in args.smap_files:
        with open(smap_filename, mode="rt") as smap_file:
            #check SMAP-file header
            line = smap_file.readline( len(smap_file_header) )
            if line != smap_file_header:
                print(f"Error: `{smap_filename}` is not a valid `*.smap`-file.", file=sys.stderr)
                sys.exit(os.EX_DATAERR)
            
            #determine SMAP-file name
            ssif_filename = re.sub(r"\.ssif\.smap$", ".ssif", smap_filename)
            if ssif_filename == smap_filename:
                ssif_filename += ".ssif"
            
            #create SSIF-file
            with open(ssif_filename, mode="xb") as ssif_file:
                #process lines of the SMAP-file
                for line in smap_file:
                    #remove trailing newline (that is: the Line Feed (LF) control character)
                    if line[-1] == "\n":
                        line = line[:-1]
                    
                    
                    #ignore empty and comment lines
                    if re.fullmatch(r"[ \t]*(?:#.*)?", line):
                        continue
                    
                    
                    #parse record
                    m = re.fullmatch(r"(?P<filename>.*) (?P<offset>[0-9a-fA-F]+) (?P<length>[0-9a-fA-F]+)", line)
                    
                    m2ts_filename = m["filename"]
                    offset = int(m["offset"], 16) * 2048
                    length = int(m["length"], 16) * 2048
                    
                    
                    #append range to SSIF-file
                    with open(m2ts_filename, mode="rb") as m2ts_file:
                        m2ts_file.seek(offset)
                        
                        while length > 0:
                            #determine read size
                            if length > default_maximum_read_size:
                                read_size = default_maximum_read_size
                            else:
                                read_size = length
                            
                            
                            #read from the M2TS-file
                            buffer = m2ts_file.read(read_size)
                            
                            buffer_size = len(buffer)
                            length -= buffer_size
                            
                            
                            #check for a premature end of the file
                            if (buffer_size == 0)  and  (length != 0):
                                print(f"Error: Couldn not read {length} bytes from `{m2ts_filename}`.", file=sys.stderr)
                                sys.exit(os.EX_DATAERR)
                            
                            
                            #write buffer
                            ssif_file.write(buffer)
    
    
    sys.exit(os.EX_OK)
if __name__ == "__main__":
    main()
#This program is free software: you can redistribute it and/or modify it under
#the terms of the GNU General Public License as published by the Free Software
#Foundation, either version 3 of the License, or (at your option) any later
#version.
#This program is distributed in the hope that it will be useful, but WITHOUT ANY
#WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
#PARTICULAR PURPOSE.
#See the GNU General Public License for more details.
#You should have received a copy of the GNU General Public License along with
#this program. If not, see <https://www.gnu.org/licenses/>.
HTH,
Jemima
 Using any DVD/Blu-ray burning software, such as Imgburn, use the write to image to create the full iso from the mounted mini iso
 Using any DVD/Blu-ray burning software, such as Imgburn, use the write to image to create the full iso from the mounted mini iso