From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: A Soare Newsgroups: gmane.emacs.devel Subject: Re: rescale srt files Date: Thu, 9 Sep 2010 19:49:40 +0000 (UTC) Message-ID: References: <13770423.659811283935719877.JavaMail.www@wwinf4633> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Trace: dough.gmane.org 1284061864 24676 80.91.229.12 (9 Sep 2010 19:51:04 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Thu, 9 Sep 2010 19:51:04 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Sep 09 21:51:03 2010 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Otn9A-0007iC-D0 for ged-emacs-devel@m.gmane.org; Thu, 09 Sep 2010 21:51:00 +0200 Original-Received: from localhost ([127.0.0.1]:47756 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Otn99-0000HH-Ne for ged-emacs-devel@m.gmane.org; Thu, 09 Sep 2010 15:50:59 -0400 Original-Received: from [140.186.70.92] (port=42918 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Otn86-0008N7-7s for emacs-devel@gnu.org; Thu, 09 Sep 2010 15:49:55 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1Otn84-0003mO-Dm for emacs-devel@gnu.org; Thu, 09 Sep 2010 15:49:53 -0400 Original-Received: from lo.gmane.org ([80.91.229.12]:36287) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Otn84-0003mC-3Y for emacs-devel@gnu.org; Thu, 09 Sep 2010 15:49:52 -0400 Original-Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1Otn81-00074S-Kc for emacs-devel@gnu.org; Thu, 09 Sep 2010 21:49:49 +0200 Original-Received: from mobile-3G-dyn-BU-81-240.zappmobile.ro ([mobile-3G-dyn-BU-81-240.zappmobile.ro]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Thu, 09 Sep 2010 21:49:49 +0200 Original-Received: from alinsoar by mobile-3G-dyn-BU-81-240.zappmobile.ro with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Thu, 09 Sep 2010 21:49:49 +0200 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 203 Original-X-Complaints-To: usenet@dough.gmane.org X-Gmane-NNTP-Posting-Host: sea.gmane.org User-Agent: Loom/3.14 (http://gmane.org/) X-Loom-IP: 93.112.81.240 (Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.13) Gecko/2009082121 Ant.com Toolbar 2.0.1 Iceweasel/3.0.6 (Debian-3.0.6-1)) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:129832 Archived-At: I wrote that script in 2006, and used it all the time since. I re wrote it almost completely before yesterday. Today I did a few minor changes. I attach here again the last versin. If you need it, use and modify it as you wish. The same if you want to install it in emacs. You are free to modify it to conform to the emacs' writinf rules. ------------------------------------------ *** (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 group (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 write-one-hunk (hunk) (set 'stime (dialog-get 'START-TIME hunk)) (set 'etime (dialog-get 'END-TIME hunk)) (insert (format "%d\n%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d\n%s\n\n" (dialog-get 'INDEX hunk) (car stime) (cadr stime) (nth 2 stime) (nth 3 stime) (car etime) (cadr etime) (nth 2 etime) (nth 3 etime) (dialog-get 'TEXT hunk) ) ) ) (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 rescale (what) (+ first-required-dialog-time (truncate (* (- (dialog-get what x) first-orginal-dialog-time) speed) ) ) ) (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) ) ) (progn (let ((speed (/ (float (- second-required-dialog-time first-required-dialog-time) ) (float (- second-orginal-dialog-time first-orginal-dialog-time) ) ) ) ) (dolist (x titrage) (let ((new-start-time (miliseconds-to-timestamp (if first-required-dialog-time (rescale 'START-TIME) (dialog-get 'START-TIME x) ) ) ) (new-end-time (miliseconds-to-timestamp (if first-required-dialog-time (rescale 'END-TIME) (dialog-get 'END-TIME x) ) ) ) ) (dialog-set 'START-TIME new-start-time x ) (dialog-set 'END-TIME new-end-time 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) (write-one-hunk x) ) ) (make-new-file (re-titrage "/1" ;; first-required-dialog-time = NIL lorsqu'on veut enchainer 2 fichiers ;; (la vitesse demeure toujours constante a 1 en ce cas) (timestamp-to-miliseconds 0 3 34 0) ;; nil ;; INDEX 1 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 ( 1 lorsque first-required-dialog-time est NIL. ) ;; ;; "/2" ;; ;; lorsqu'on a la deuxieme partie, on est cense d'y pourvoir la ;; longueur de la premiere partie ;; ;; (timestamp-to-miliseconds 1 7 6 0 ) ) ) '( (eval-current-buffer) )