spojeni_vob-titulku.py
changeset 0 fc80602b39ce
equal deleted inserted replaced
-1:000000000000 0:fc80602b39ce
       
     1 #!/usr/bin/python
       
     2 # coding=utf8
       
     3 
       
     4 from optparse import OptionParser
       
     5 from subprocess import *
       
     6 from re import *
       
     7 from shutil import *
       
     8 import os		# os.open koliduje s built-in open
       
     9 global predchozi_index
       
    10 
       
    11 def strt(time):
       
    12     secs=int(time)
       
    13     fract=time-secs
       
    14     hrs=str(100+secs//3600)[-2:]
       
    15     min=str(100+(secs%3600)//60)[-2:]
       
    16     sec=str(100+secs%60)[-2:]
       
    17     fra=str(1000+1000*fract)[1:4]
       
    18     return hrs+":"+min+":"+sec+":"+fra
       
    19 
       
    20 def dect(time):
       
    21     s=split(":", time)
       
    22     return int(s[0])*3600+int(s[1])*60+int(s[2])+float(s[3])/1000
       
    23 
       
    24 def deb(line):
       
    25     if 'DEB' in os.environ: 
       
    26         try: 
       
    27             if int(os.environ['DEB'])>0:
       
    28                 for x in line: print x, 
       
    29                 print
       
    30         except: return
       
    31     
       
    32 class jazyk:				# titulky jednoho jazyka
       
    33     def __init__(self, idx):
       
    34         self.idx=idx			# pořadí jazyka z indexu
       
    35         self.id=idxi.line.split(',')[0].split(': ')[1]
       
    36         self.head=idxi.line		# header jazyka
       
    37         self.index=[index(), index()]	# dílčí indexy pro jazyk v jednotlivých dílech
       
    38         self.image=["", ""]		# dílčí images pro jazyk v jednotlivých dílech 
       
    39     def nacti(self):
       
    40         deb(("jazyk", self.id))
       
    41         line=idxi.next()
       
    42         while line and not match(r"^timestamp:", line): line=idxi.next()		# dojeď na začátek záznamů s timestampy
       
    43         if not line: return
       
    44         self.index[dil].index_lines()
       
    45         print "konec dílu jazyka", self.id
       
    46         deb(("délka indexu", len(self.index[dil].time_pos)))
       
    47     
       
    48 class index:				# dílčí index jazyka za jeden díl
       
    49     def __init__(self):
       
    50         self.time_pos=[]
       
    51         self.image=""
       
    52         self.img_beg=0
       
    53         self.img_end=0
       
    54         self.img_len=0
       
    55         self.img_del=0
       
    56     def index_lines(self):
       
    57         global predchozi_index
       
    58         zacatek=True
       
    59         line=idxi.line
       
    60         while line and match(r"^timestamp:", line):
       
    61             timestamp=search(r"^timestamp:\s(\d\d:\d\d:\d\d:\d\d\d)", line).group(1)
       
    62             position=eval("0x"+search(r"filepos:\s([a-z0-9]+)", line).group(1))
       
    63             if zacatek:
       
    64                 if predchozi_index and predchozi_index.img_len==0:
       
    65                     deb(("načítá se image k předchozímu indexu",))
       
    66                     predchozi_index.getimage(position)
       
    67                 predchozi_index=self
       
    68                 self.img_beg=position
       
    69                 zacatek=False
       
    70             if dil==0 and timestamp>off_set: break	# výchozí díly filmu se mohou překrývat, a proto se případně 1.díl zařezává a s ním i jeho titulky    
       
    71             self.time_pos.append((timestamp, position))
       
    72             line=idxi.next()
       
    73         if line and match(r"^timestamp:", line):
       
    74             deb(("konec zkráceného image",))
       
    75             self.getimage(position)
       
    76         if not line:
       
    77             deb(("konec image na konci file",))
       
    78             self.getimage(None)
       
    79         if line:
       
    80             deb(("konec dílu image",))
       
    81         while line and match(r"^timestamp:", line):	# projedeme ignorovanou část zařízutého 1.dílu
       
    82             line=idxi.next()
       
    83         #if timePosList.size()>0: img_beg=time_posList.getFirst().position
       
    84     def getimage(self, position):	# načti díl image k právě načtenému dílu indexu
       
    85         if position:	self.img_len=position-self.img_beg
       
    86         else:     	self.img_len=img_sizes[dil+1]-self.img_beg
       
    87         deb(("čte se ", self.img_len, "na offsetu", self.img_beg))
       
    88         self.image=imgi.read(self.img_len)
       
    89         deb(("precteno", self.img_len, "z", imgi_fn))
       
    90         
       
    91 class index_file:
       
    92     def __init__(self, fn):
       
    93         self.line=None
       
    94         self.inf=open(fn, "r")
       
    95     def next(self):
       
    96         try: self.line=self.inf.next()
       
    97         except StopIteration: self.line=None
       
    98         return self.line
       
    99     def close(self): self.inf.close()        
       
   100     
       
   101 usage = "usage: %prog <output_base> <1.part>.vob <2.part>.vob <1.part>.avi"
       
   102 parser = OptionParser(usage=usage)
       
   103 options, args = parser.parse_args()
       
   104 if len(args)<4:
       
   105     print ">>> Povinné jsou 4 argumenty.\n"
       
   106     parser.print_help()
       
   107     exit(1)
       
   108 try:	p=Popen(["mplayer", "-v", "-endpos", "0", "-vo", "null", "-ao", "null", args[3]], stdout=PIPE, stderr=STDOUT).communicate()
       
   109 except: print "Nelze otevřít první část filmu."; exit(1)
       
   110 try:	offset2dilu=float(search(r"ID_LENGTH=([\d.]+)", p[0]).group(1))
       
   111 except: print "Nelze zjistit časovou délku první části filmu."; exit(1)
       
   112 off_set=strt(offset2dilu)
       
   113 print "Odstup druhé části:", off_set
       
   114 
       
   115 N=(args[0], args[1], args[2])
       
   116 
       
   117 try: p=os.stat(N[0]+".vob.ifo")
       
   118 except:
       
   119     try: copy2(N[1]+".ifo", N[0]+".vob.ifo")
       
   120     except: print "Problém s vytvořením", N[0]+".vob.ifo"; exit(1)
       
   121 
       
   122 img_sizes={}
       
   123 for i in (1, 2):
       
   124     try:	img_sizes[i]=os.stat(N[i]+".sub").st_size
       
   125     except:     print "Chybí", N[i]+".sub"; exit(1)
       
   126     if img_sizes[i]%2048: print "Velikost", N[i]+".sub", "není násobkem 2048."; exit(1)
       
   127 
       
   128 idxi=None
       
   129 line=None
       
   130 idxo=open(N[0]+".vob.idx", "w")
       
   131 jazyky=dict()
       
   132 
       
   133 for dil in (0, 1):			# zpracování jednotlivých dílů na vstupu
       
   134     print "dil", str(dil+1)
       
   135     predchozi_index=None
       
   136     if idxi: idxi.close()
       
   137     idxi=index_file(N[dil+1]+".idx")
       
   138     #idxi=open(N[dil+1]+".idx","r")
       
   139     line=idxi.next()
       
   140     imgi_fn=N[dil+1]+".sub"
       
   141     imgi=open(imgi_fn, "rb")
       
   142     while line:				# načtení dílčích indexů pro jednotlivé jazyky
       
   143         while line and not match(r"^id:\s", line):
       
   144             if dil==0: idxo.write(line)	# v prvním díle se zapíšou do výstupu úvodní řádky indexu
       
   145             line=idxi.next()
       
   146         if line:
       
   147             #jid=line.split(',')[0].split(': ')[1]
       
   148             jid=int(line.split('index: ')[1])
       
   149             deb(("nalezen jazyk", jid, line))
       
   150             if not jid in jazyky: jazyky[jid]=jazyk(jid)
       
   151             jazyky[jid].nacti()
       
   152             line=idxi.next()
       
   153     
       
   154 deb(("počet načtených jazyků:", len(jazyky)))
       
   155 imgo=open(N[0]+".vob.sub", "wb")
       
   156 offset=0; jid=0
       
   157 #for jid in jazyky.keys():		# sestavení výstupu
       
   158 while jid in jazyky:
       
   159     print "zápis jazyka", jazyky[jid].id
       
   160     #idxo.write("id: "+jid+", index: "+str(poradi_jazyka)+"\n")
       
   161     idxo.write(jazyky[jid].head)
       
   162     for dil in (0, 1):
       
   163         index=jazyky[jid].index[dil]
       
   164         for tp in index.time_pos:
       
   165             time = strt(dect(tp[0])+dil*offset2dilu)
       
   166             position = ("00000000"+(hex(tp[1]-index.img_beg+offset))[2:])[-9:]
       
   167             idxo.write("timestamp: "+time+", filepos: "+position+"\n")
       
   168         imgo.write(index.image); offset+=len(index.image)
       
   169     jid+=1
       
   170 
       
   171 idxo.close()
       
   172 imgo.close()