From: "A. Soare" <alinsoar@voila.fr>
To: "Emacs Dev [emacs-devel]" <emacs-devel@gnu.org>
Subject: rescale srt files
Date: Wed, 8 Sep 2010 10:48:39 +0200 (CEST) [thread overview]
Message-ID: <13770423.659811283935719877.JavaMail.www@wwinf4633> (raw)
[-- Attachment #1: Type: text/plain, Size: 371 bytes --]
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.
____________________________________________________
Découvrez les tendances de la rentrée : coiffure, mode, sports ou cuisine sur http://actu.voila.fr/evenementiel/rentree2010/
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: re-titrage2.el --]
[-- Type: text/x-emacs-lisp; name=re-titrage2.el, Size: 4990 bytes --]
(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)
)
next reply other threads:[~2010-09-08 8:48 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-08 8:48 A. Soare [this message]
2010-09-08 8:57 ` rescale srt files joakim
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=13770423.659811283935719877.JavaMail.www@wwinf4633 \
--to=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.