(defun dialog-create (INDEX START-TIME END-TIME TEXT) (list INDEX START-TIME END-TIME TEXT) ) (defun dialog-index (what) (let ((vector '( INDEX START-TIME END-TIME TEXT ) ) (r nil)) (dotimes (x 4 r ) (if (eq (nth x vector) what) (setq r x) ) ) ) ) (defun dialog-get (what dialog) (let ((pos (dialog-index what) ) ) (nth pos dialog) ) ) (defun dialog-set (what new dialog) (let ((pos (dialog-index what) ) ) (setcar (nthcdr pos dialog) new) ) dialog ) (defun timestamp-to-miliseconds (H M S MS) "convert a list (HOUR MINUTE SECONDS MILISECONDS) to TIMESTAMP (MILISECONDS)" (+ MS (* 1000 (+ S (* M 60) (* H 3600) ) ) ) ) (defun miliseconds-to-timestamp (TIMESTAMP) "convert TIMESTAMP (MILISECONDS) to the list (HOUR MINUTE SECONDS MILISECONDS)" (let (MS S M H) (setq MS (% TIMESTAMP 1000) ; miliseconds TIMESTAMP (/ (- TIMESTAMP MS) 1000) S (% TIMESTAMP 60) ; seconds TIMESTAMP (/ (- TIMESTAMP S) 60) M (% TIMESTAMP 60) ; minutes H (/ (- TIMESTAMP M) 60) ) ; hours (list H M S MS) ) ) (defun read-text (limit &optional skip-first type) (and skip-first (re-search-forward skip-first) ) (let ((data (buffer-substring (point) (- (re-search-forward limit) (length limit) ) ) ) ) (if (eq type 'S) data (string-to-number data ) ) ) ) ;; 608 ;; 1:0:27,650 --> 1:0:34,849 ;; One hunk starts at `608', and ends before `609'. ;; This is the text of the current hunk. ;; ;; 609 ;; 1:0:38,723 --> 1:0:41,839 ;; TEXT-HUNK `609' (defun read-one-hunk nil (setq index (+ (read-text "\n") last-index-first-file)) (let ((HHs (read-text ":")) (MMs (read-text ":")) (SSs (read-text ",")) (MSs (read-text " ")) (HHe (read-text ":" "-->") ) (MMe (read-text ":")) (SSe (read-text ",")) (MSe (read-text "\n")) (text (read-text "\n\n" nil 'S) ) ) ;; jumps to the beginning of the next hunk (skip-chars-forward "[:blank:]\n") (dialog-create index (+ (timestamp-to-miliseconds HHs MMs SSs MSs) offset ) (+ (timestamp-to-miliseconds HHe MMe SSe MSe) offset ) text ) ) ) (defun read-file-srt (file offset) (let (index prev-index) (with-current-buffer (find-file-noselect file) (goto-char 1) (while (> (buffer-size) (point) ) (push (read-one-hunk) titrage) (if (and prev-index (> 1 (- index prev-index ) ) ) (error "srt file contains errrors [ at the index %d ]" prev-index) ) (setq prev-index index) ) (kill-buffer (current-buffer) ) ) ) ) (defun re-titrage (File1 first-required-dialog-time first-index second-required-dialog-time second-index &optional File2 length-first-part ) (let ((last-index-first-file 0) titrage first-orginal-dialog-time second-orginal-dialog-time) (read-file-srt File1 0) (setq last-index-first-file (dialog-get 'INDEX (car titrage) ) ) (and File2 (read-file-srt File2 length-first-part) ) (setq titrage (nreverse titrage)) (setq second-orginal-dialog-time (dialog-get 'START-TIME (nth (1- second-index) titrage) ) first-orginal-dialog-time (dialog-get 'START-TIME (nth (1- first-index) titrage) ) ) (and first-required-dialog-time (progn (let ((speed (/ (float (- second-required-dialog-time first-required-dialog-time) ) (float (- second-orginal-dialog-time first-orginal-dialog-time) ) ) ) ) (dolist (x titrage) (dialog-set 'START-TIME (+ first-required-dialog-time (truncate (* (- (dialog-get 'START-TIME x) first-orginal-dialog-time) speed) ) ) x ) (dialog-set 'END-TIME (+ first-required-dialog-time (truncate (* (- (dialog-get 'END-TIME x) first-orginal-dialog-time) speed) ) ) x ) ) ) ) ) titrage) ) (defun make-new-file (titrage) (setq default-enable-multibyte-characters nil) (set-buffer-multibyte nil) (set-buffer (find-file "new") ) (dolist (x titrage) (set 'stime (miliseconds-to-timestamp (dialog-get 'START-TIME x) ) ) (set 'etime (miliseconds-to-timestamp (dialog-get 'END-TIME x) ) ) (insert (format "%d\n%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d\n%s\n\n" (dialog-get 'INDEX x) (car stime) (cadr stime) (nth 2 stime) (nth 3 stime) (car etime) (cadr etime) (nth 2 etime) (nth 3 etime) (dialog-get 'TEXT x) ) ) ) ) (make-new-file (re-titrage "/1" ;; NIL lorsqu'on veut enchainer 2 fichiers ;; la vitesse demeure toujours constante a 1 (timestamp-to-miliseconds 0 3 34 0) ;; nil ;; INDEX 1 ou NIL 16 ;; le deuxieme dialogue (timestamp-to-miliseconds 1 37 51 0 ) ;; INDEX 2 1467 ;; le deuxieme fichier (quand existant) va avoir la meme vitesse que ;; le premier. ;; ;; "/2" ;; ;; lorsqu'on a la deuxieme partie, on est cense d'y pourvoir le ;; moment de la fin de la premiere partie ;; ;; (timestamp-to-miliseconds 1 7 6 0 ) ) ) '( (eval-current-buffer) )