Code covered by the BSD License  

Highlights from
SubSync: ReSync *.srt subtitles

from SubSync: ReSync *.srt subtitles by Mark Bos
SubSync.m adjusts *.srt subtitles by defining timeshift or begin-/endtimes.

SubSync(Folder,FileOld,FileNew,varargin)
function SubSync(Folder,FileOld,FileNew,varargin) 
% SubSync(Folder,FileOld,FileNew,dt)
% SubSync(Folder,FileOld,FileNew,T1,Te)
% 
%     Input:
%   Folder:  destined folder
%   FileOld: source *.srt file 
%   FileNew: destination *.srt file
% 
%   dt:      timeshift in (s)
% 
%   T1:      begintime of line 1; vector with [H M S sss], sss in thousands of seconds
%   Te:      begintime of last line; vector with [H M S sss]
% 
%     Output:
%   A *.srt file with name FileNew in the defined folder with adjusted timing
% 
%   Written by Mark Bos, 2011
% 

switch (length(varargin))
    case 1
        dt=varargin{1};
    case 2
        T1=varargin{1};
        Te=varargin{2};
    otherwise
        return
end

SubOld=[Folder,'\',FileOld];
SubNew=[Folder,'\',FileNew];

fid=fopen(SubOld,'r');
fod=fopen(SubNew,'wt');

[data]=LoadSrt(fid);


switch (length(varargin))
    case 1
        data(1).TimesBeginNew=data(1).TimesBegin+dt;
        data(1).TimesEndNew=data(1).TimesEnd+dt;
        
    case 2
        Tbegin=T1(1)*3600+T1(2)*60+T1(3)+T1(4)/1000;
        Teind=Te(1)*3600+Te(2)*60+Te(3)+Te(4)/1000;
        
        dtOld=data(1).TimesBegin(end)-data(1).TimesBegin(1);
        dtNew=Teind-Tbegin;
        
        data(1).TimesBeginNew=data(1).TimesBegin*(dtNew/dtOld);
        data(1).TimesEndNew=data(1).TimesEnd*(dtNew/dtOld);
        
        a=(data(1).TimesBeginNew(1)-Tbegin);
        
        data(1).TimesBeginNew=data(1).TimesBeginNew-a;
        data(1).TimesEndNew=data(1).TimesEndNew-a;
end


WriteSrt(fod,data);

fclose ('all');
end




function [data]=LoadSrt(fid)
while ~feof(fid)
    Numb=str2num(fgetl(fid));
    if isempty(Numb)
        continue
    end
    data(Numb).Times=fgetl(fid);
    [begin,eind]=DetTimes(data(Numb).Times);
    
    data(1).TimesBegin(Numb)=begin;
    data(1).TimesEnd(Numb)=eind;
    
    
    i=1;
    data(Numb).Line{1}=fgetl(fid);
    while ~isempty(data(Numb).Line{i})
        i=i+1;
        data(Numb).Line{i}=fgetl(fid);
    end
end
end


function [begin,eind]=DetTimes(TIMES)
begin=str2num(TIMES(1:2))*3600+str2num(TIMES(4:5))*60+str2num(TIMES(7:8))+str2num(TIMES(10:12))/1000;
eind=str2num(TIMES(18:19))*3600+str2num(TIMES(21:22))*60+str2num(TIMES(24:25))+str2num(TIMES(27:29))/1000;
end



function WriteSrt(fod,data)
teller=1;
for i1=1:length(data(1).TimesBeginNew)
    t1=data(1).TimesBeginNew(i1);
    t2=data(1).TimesEndNew(i1);
    
    if t1>0
    fprintf(fod,'%d\n',teller);
    H1=floor(t1/3600);t1=t1-H1*3600;
    M1=floor(t1/60);t1=t1-M1*60;
    S1=floor(t1);t1=t1-S1;
    s1=floor(t1*1000);
    
    H2=floor(t2/3600);t2=t2-H2*3600;
    M2=floor(t2/60);t2=t2-M2*60;
    S2=floor(t2);t2=t2-S2;
    s2=floor(t2*1000);
    
    fprintf(fod,'%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d\n',H1,M1,S1,s1,H2,M2,S2,s2);
    
    for i2=1:length(data(i1).Line)
        fprintf(fod,'%s\n',data(i1).Line{i2});
    end
    teller=teller+1;
    end
end

%Signature
fprintf(fod,'%d\n',teller);

t2=data(1).TimesEndNew(i1);
t1=t2+1;
t2=t1+3;

H1=floor(t1/3600);t1=t1-H1*3600;
M1=floor(t1/60);t1=t1-M1*60;
S1=floor(t1);t1=t1-S1;
s1=floor(t1*1000);

H2=floor(t2/3600);t2=t2-H2*3600;
M2=floor(t2/60);t2=t2-M2*60;
S2=floor(t2);t2=t2-S2;
s2=floor(t2*1000);

fprintf(fod,'%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d\n',H1,M1,S1,s1,H2,M2,S2,s2);
fprintf(fod,'%s\n','ReSync by Mark Bos');
end

Contact us