all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: joakim@verona.se
To: alinsoar@voila.fr
Cc: "Emacs Dev \[emacs-devel\]" <emacs-devel@gnu.org>
Subject: Re: rescale srt files
Date: Wed, 08 Sep 2010 10:57:55 +0200	[thread overview]
Message-ID: <m3wrqwa9yk.fsf@verona.se> (raw)
In-Reply-To: <13770423.659811283935719877.JavaMail.www@wwinf4633> (A. Soare's message of "Wed, 8 Sep 2010 10:48:39 +0200 (CEST)")

"A. Soare" <alinsoar@voila.fr> writes:

> I attach here a procedure to rescale the srt files. I use it all the time to change the speed and the offset of a subtitle file. It can also join 2 files in only one.

Interesting! I will probably have use for your code.

However, I believe you will get better exposure for this type of progam
on the emacs-sources list, and the emacswiki.

>
>
>
>
>
>
>
> ____________________________________________________
>
>  Découvrez les tendances de la rentrée : coiffure, mode, sports ou cuisine  sur http://actu.voila.fr/evenementiel/rentree2010/ 
>
>
> (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)
>    
>    )

-- 
Joakim Verona



  reply	other threads:[~2010-09-08  8:57 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-09-08  8:48 rescale srt files A. Soare
2010-09-08  8:57 ` joakim [this message]
2010-09-08  9:04   ` Leo
2010-09-09 19:49 ` A Soare

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m3wrqwa9yk.fsf@verona.se \
    --to=joakim@verona.se \
    --cc=alinsoar@voila.fr \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.