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