Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: ovichan en 3 Agosto 2012, 20:17 pm



Título: [BATCH] Edición archivo SRT
Publicado por: ovichan en 3 Agosto 2012, 20:17 pm
Hola de nuevo, el caso es que necesito editar 291 archivos del tipo srt, que en base es practicamente es lo mismo que un txt, con extension diferente.

Bueno he leido este hilo para poder hacer sustitucion de palabras http://foro.elhacker.net/scripting/acciones_sobre_archivos_de_texto_batch-t242748.0.html. Sin embargo este codigo me da error y no me funciona:

Intento cambiar en el texto los puntos suspensivo con espacios por puntos suspensivos sin espacios.
Código
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=* delims=" %%x in ('type C:\Users\Isra\Desktop\Cap 01 B.srt') do (
  4. set linea=%%x
  5. set linea=!linea:. . .=...!
  6. call :show !linea!
  7. )
  8. goto:eof
  9. :show
  10. echo %* >> "C:\Users\Isra\Desktop\Cap 01 B mod.srt"
  11. goto:eof

Alguna idea de que está pasando??



Elektro H@cker: No tienes que usar el botón "insertar cita" sinó el de "insertar código".


Título: Re: [BATCH] Edición archivo SRT
Publicado por: leogtz en 3 Agosto 2012, 20:52 pm
Cuando estés trabajando con archivos que tengan espacios en su nombre, es preferible agregar comillas dobles, así:
Código:
for /f "tokens=* delims=" %%x in ('type "C:\Users\Isra\Desktop\Cap 01 B.srt"') do (

Prueba si así te funciona.


Título: Re: [BATCH] Edición archivo SRT
Publicado por: Eleкtro en 3 Agosto 2012, 21:17 pm
Hola,

Desde luego el fallo en el code salta a la vista y con la corrección del compañero Leo es suficiente.

Pero aparte, Los archivos de subtitulos suelen contener caracteres especiales como el signo de exclamación, El cual lo "destruyes" por completo al habilitar la expansión, Y otros archivos caracteres que debes escapar (>) y/o reemplazar (¡¿ áéíóú ÁÉÍÓÚ ñ).

Ejemplo:
Juego de tronos.srt
Código:
00:24:44,884 --> 00:24:46,927 
Los hombres cordero
son buenos esclavos!

Así que yo lo dejaría (como mínimo) así, Y ya tu haces los siguientes reemplazamientos necesarios de los caracteres:
Código
  1. @echo off
  2. for /f "tokens=*" %%X in ('type "%userprofile%\Desktop\Cap 01 B.srt"') do (
  3. set "linea=%%X"
  4. Call :Replace
  5. Call Echo %%Linea_final%% >> "%userprofile%\Desktop\Cap 01 B mod.srt"
  6. )
  7.  
  8. :Replace
  9. set "linea=%linea:. . .=...%"
  10. set "linea=%linea:>=^>%"
  11. set "linea=%linea:)=^)%"
  12. Set "Linea_final=%LINEA%"
  13. Goto:EOF

Saludos.


Título: Re: [BATCH] Edición archivo SRT
Publicado por: ovichan en 3 Agosto 2012, 23:20 pm
Gracias, lo voy a probar y os cuento, desconocía que pudiera insertar doble comilla dentro de otras comillas, no tengo tanto nivel ^^'.

Con respecto a lo del codigo en vez de quote, me ha kedao claro  :silbar:. No volverá a pasar.



Título: Re: [BATCH] Edición archivo SRT
Publicado por: ovichan en 4 Agosto 2012, 15:42 pm
@Leo Gutiérrez

Está probado y asi realiza su función aunque como dice EleKtro H@cker, se come ciertos caracteres

@EleKtro H@cker

El código que has puesto funciona pero se come el espacio antes de los numeros de la línea por lo que al editar el srt resultante en aegisub, me inserta todos los subtitulos en una sola linea.

Por cierto, mis srt están codificados en Unicode, podría automatizar el cambio a UTF-8??

Gracias de nuevo.


Título: Re: [BATCH] Edición archivo SRT
Publicado por: Eleкtro en 4 Agosto 2012, 17:15 pm
El código que has puesto funciona pero se come el espacio antes de los numeros de la línea
El problema es que "For" no procesa las lineas en blanco de un archivo, Pero bueno por suerte, Como son solo números, Con esto queda arreglado:

Código
  1. @echo off
  2. for /f "tokens=*" %%X in ('type "%userprofile%\Desktop\1.srt"') do (
  3. set /A "linea=%%X" 2>NUL && Echo+ >>"%userprofile%\Desktop\Cap 01 B mod.srt"|| (set "linea=%%X")
  4. Call :Replace
  5. Call Echo %%Linea_final%% >> "%userprofile%\Desktop\Cap 01 B mod.srt"
  6. )
  7.  
  8.  
  9. :Replace
  10. set "linea=%linea:. . .=...%"
  11. set "linea=%linea:>=^>%"
  12. set "linea=%linea:)=^)%"
  13. Set "Linea_final=%LINEA%"
  14. Goto:EOF



mis srt están codificados en Unicode, podría automatizar el cambio a UTF-8??
No.
Aunque puedes usar el comando type:
Código
  1. Type archivo.srt > archivoNUEVO.srt
El cual automáticamente codifica en formato ANSI, Pero para convertirlo a UTF-8 no hay manera de hacerlo en Batch.
EDITO: Bueno en realidad, Batch por defecto guarda todo lo redireccionado en codificación ANSI...

¿Porque quieres que estén en formato utf-8? (UTF También es Unicode)

Bueno, Necesitas usar alguna herramienta de terceros por linea de comandos (Alguna hay, pero no recuerdo el nombre).
O adaptar este VBS para llamarlo desde Batch usando argumentos:

Cita de: GOOGLE
Código
  1. Option Explicit
  2.  
  3. Sub Save2File (sText, sFile)
  4.    Dim oStream
  5.    Set oStream = CreateObject("ADODB.Stream")
  6.    With oStream
  7.        .Open
  8.        .CharSet = "utf-8"
  9.        .WriteText sText
  10.        .SaveToFile sFile, 2
  11.    End With
  12.    Set oStream = Nothing
  13. End Sub
  14.  
  15. ' Example usage: '
  16. Save2File "The data I want in utf-8", "test.txt"

Salu2


Título: Re: [BATCH] Edición archivo SRT
Publicado por: ovichan en 4 Agosto 2012, 17:38 pm
Vamos a probar, aunque no entiendo muy bien la linea

Código:
set /A "linea=%%X" 2>NUL && Echo+ >>"%userprofile%\Desktop\Cap 01 B mod.srt"|| (set "linea=%%X")

Estableces como variable aritmetica LINEA, pero 2>NUL no se que es ( en C sería 2 mayor que vacio). Lo siguiente seria insertarle la linea con el echo, redireccionar al archivo srt, pero la parte "|| (set "linea=%%X")"; tampoco le pillo.

En cuanto a codificacion del archivo es por aegisub pues al abrirlo me arroja el error: "Parsing Srt: Incomplete file". Si lo paso a UTF8 con notepad no hay problema al abrirlo.

Gracias


Título: Re: [BATCH] Edición archivo SRT
Publicado por: Eleкtro en 4 Agosto 2012, 18:27 pm
no entiendo muy bien la linea
Código:
set /A "linea=%%X" 2>NUL && Echo+ >>"%userprofile%\Desktop\Cap 01 B mod.srt"|| (set "linea=%%X")
Estableces como variable aritmetica LINEA, pero 2>NUL no se que es ( en C sería 2 mayor que vacio). Lo siguiente seria insertarle la linea con el echo, redireccionar al archivo srt, pero la parte "|| (set "linea=%%X")"; tampoco le pillo.


Exacto, Establezco la variable, Si el string no es númerico entonces el comando SET manda un código de error, Con "2>NUL" redireccionamos la salida del mensaje de error simplemente para que no aparezca en la consola y no moleste.

El "||" es el operador lógico de excepción (Lo que en C equivaldria a throw o catch, creo, No se "C"), Es decir, Que si el comando SET manda un código de error pues se procesa lo que está a la derecha  de las pipes, Y si no manda código de error, Se procesa solamente lo que está a la derecha del operador "&&".

Salu2
 


Título: Re: [BATCH] Edición archivo SRT
Publicado por: ovichan en 4 Agosto 2012, 21:39 pm
En C es try...catch. Mas o menos lo he pillado, es como los asserts. Bueno luego lo pruebo que estoy de bbk. Gracias


Título: Re: [BATCH] Edición archivo SRT
Publicado por: ovichan en 6 Agosto 2012, 02:20 am
Todo bien excepto que el primer numero de linea, lo cambia de 1 a 0. Siendo el primer numero de linea el 0 y el siguiente que le sigue es el 2.

Edito: creo que debe interpretar el 1 como operando logico y lo transforma, o algo raro.


Título: Re: [BATCH] Edición archivo SRT
Publicado por: Eleкtro en 6 Agosto 2012, 18:44 pm
Todo bien excepto que el primer numero de linea, lo cambia de 1 a 0. Siendo el primer numero de linea el 0 y el siguiente que le sigue es el 2.
Eso que comentas no me pasa a mi, Los números no se me cambian de orden, ¿Lo que quieres decir es que se agrega una primera linea en blanco, En el nuevo archivo? (Eso sí)

Bueno aparte de eso he encontrado un fallo que se me habia pasado, El problema aparece en las frases que llevan comas, Y es por como se interpretan las comas en el comando Set /A al intentar hacer la operación, Y el string final de las frases con comas no se llega a setear bien, Se setean como "0", Así que te lo hago de otro modo (Este lo he testeado mejor) Y mejoro generalmente el script un poco más:

Código
  1. @echo off
  2.  
  3. REM El código de páginas para no tener que manipular el string para reemplazar caracteres latinos.
  4. CHCP 1250 >NUL
  5.  
  6. For /R %%# in (*.srt) Do (
  7. Echo Procesando archivo "%%~nx#"
  8. FOR /F "tokens=*" %%X in ('Type "%%#"') do (
  9. Echo "%%X"| findstr /R ".[^0-9]." >NUL || (Echo+ >> "%TEMP%\%%~nx#.srt")
  10. set "linea=%%X"
  11. Call :Replace
  12. Call Echo %%Linea_final%% >> "%TEMP%\%%~nx#.srt"
  13. )
  14. Type "%TEMP%\%%~nx#.srt" | MORE +1 > "%%~n#.MOD.%%~x#"
  15. Del /Q "%TEMP%\%%~nx#.srt"
  16. )
  17.  
  18.  
  19. :Replace
  20. set "linea=%linea:>=^>%"
  21. set "linea=%linea:)=^)%"
  22. set "linea=%linea:. . .=...%"
  23. Set "Linea_final=%LINEA%"
  24. Goto:EOF

Salu2


Título: Re: [BATCH] Edición archivo SRT
Publicado por: ovichan en 6 Agosto 2012, 19:35 pm
Gracias por tus esfuerzos ahora si que no me entero del codigo pero lo estudiare tranquilamente con una cervecita.

Los subs me quedan asi:

(http://s9.postimage.org/e7p6i6m1b/Captura.png)

Como ves, elimina el primer numero de linea.

Te pongo tu codigo, adaptado a mis necesidades por si la estoy pifiando, pero creo que no.

Código:
@echo off
setlocal enabledelayedexpansion

REM El código de páginas para no tener que manipular el string para reemplazar caracteres latinos.
CHCP 1250 >NUL
 
For /R %%# in (*.srt) Do (
Echo Procesando archivo "%%~nx#"
FOR /F "tokens=*" %%X in ('Type "%%#"') do (
Echo "%%X"| findstr /R ".[^0-9]." >NUL || (Echo+ >> "%TEMP%\%%~nx#.srt")
set "linea=%%X"
Call :Replace
Call Echo %%Linea_final%% >> "%TEMP%\%%~nx#.srt"
)
Type "%TEMP%\%%~nx#.srt" | MORE +1 > "%%~n#.MOD.%%~x#"
Del /Q "%TEMP%\%%~nx#.srt"
)
Exit
Exit
 
:Replace
set "linea=%linea:. . .=...%"
set "linea=%linea:¿ =¿%"
set "linea=%linea:¡ =¡%"
set "linea=%linea:Klilyn=Krilin%"
set "linea=%linea:Ginew=Ginyu%"
set "linea=%linea:>=^>%"
set "linea=%linea:)=^)%"
Set "Linea_final=%LINEA%"
Goto:EOF

Gracias


Título: Re: [BATCH] Edición archivo SRT
Publicado por: Eleкtro en 6 Agosto 2012, 20:43 pm
Los subs me quedan asi:

Como ves, elimina el primer numero de linea.

Eso lo hice a propósito, Porque el script, Cuando encuentra un número identificador, Primero escribe una linea en blanco en el archivo MOD, Y luego escribe ese número, Así que por pura lógica la primera linea del archivo MOD siempre será una linea en blanco, Pero no comprendo porqué en las capturas que has puesto de tu SRT no sucede como debería :S

Pero bueno, Simplemente elimina lo que he marcado en rojo en la siguiente linea (Es el comando para comerse la primera linea del archivo MOD) y ya te debería funcionar como tú quieres:
Citar
Type "%TEMP%\%%~nx#.srt" | MORE +1 > "%%~n#.MOD.%%~x#"

Saludos


Título: Re: [BATCH] Edición archivo SRT
Publicado por: ovichan en 7 Agosto 2012, 01:02 am
Sencillamente genial, me va a ser de gran ayuda. Ademas con esto tengo tarea para estudiar, no entiendo ni la mitad jeje. Gracias


Título: Re: [BATCH] Edición archivo SRT
Publicado por: ovichan en 7 Agosto 2012, 01:33 am
Siento el repost pero he encontrado un fallo en la edicón de los subs, te pongo una captura:

(http://s7.postimage.org/c89oljnaj/Captura_subs.png)

Al parecer los signos de interrogacion de izquierdas (¿) los cambia a los de derechas (?). Cuando se encuentra signos exclamativos, lo procesa o no. Qué locura!!!  :laugh:


Título: Re: [BATCH] Edición archivo SRT
Publicado por: Eleкtro en 7 Agosto 2012, 02:43 am
he encontrado un fallo en la edicón de los subs
los signos de interrogacion de izquierdas (¿) los cambia a los de derechas (?).
Cuando se encuentra signos exclamativos, lo procesa o no. Qué locura!!!  :laugh:

Hola,

El último script que puse funciona perfectamente con todos los caracteres (Si, Procesa los signos que están al revés, Todo).

Pero Batch no puede leer (correctamente) Unicode, Debes pasar primero los SRT a UTF-8 o ANSI con aquél VBS por ejemplo, O así:

Código
  1. @Echo OFF
  2. CHCP 1250
  3. Type archivoUNICODE.srt>ArchivoANSI.srt
(Ojo, El código de páginas es necesario para que convierta bien los caracteres latinos...)

NOTA: Y para que el script reconozca los caracteres ¡¿áéíóú, etc... de los SRT, Debes guardar tanto los SRT como el BAT en la misma codificación.

Osea:
Código
  1. set "linea=%linea:¿ =¿%"
  2. set "linea=%linea:¡ =¡%"
Si usas eso desde un BAT ANSI sobre un SRT UTF-8, O desde un BAT UTF-8 sobre SRT ANSI, va a hacer una catástrofe, Como lo hace con los SRT en unicode.

EDITO: Después de testear un poco, Puedo decir que el extraño inconveniente que tenia el script, Que se te comia la primera linea del archivo, Era por probar el bat sobre un archivo SRT en distinta codificación que el Bat. Seguramente el resto de errores de conversión que has sufrido antes con el SRT haya sido por el mismo motivo.

Saludos


Título: Re: [BATCH] Edición archivo SRT
Publicado por: Eleкtro en 7 Agosto 2012, 04:18 am
Sigo en este comentario,

Creo que te toca hacer alguna conversion...

1º - De Unicode a ANSI (Porque de Unicode a UTF-8 no se hacerlo directamente sin aplicaciones, Y sin perder los caracteres especiales) para usar el bat.
2º - De ANSI a lo que quieras:

Código
  1. @Echo off
  2. wscript.exe convert.vbs "archivo"

PD:
Código
  1. objStream.Charset = AQUÍ EL CHARSET

NOTA: No intentes pasar de ANSI a utf-8 con este vbs porque se corrompen todos los caracteres de nuestro idioma ::(. Pero puedes pasarlo a Unicode,iso-8859-2, o ascii sin perder nada.

Convert.vbs
Código
  1. Option Explicit
  2.  
  3. Dim objFSO, strFileIn, strFileOut
  4.  
  5. strFileIn = WScript.Arguments.Item(0)
  6.  
  7. Set objFSO = CreateObject( "Scripting.FileSystemObject" )
  8. strFileOut = objFSO.GetBaseName( strFileIn ) & "_utf8.txt"
  9. Set objFSO = Nothing
  10.  
  11. UTF8 strFileIn, strFileOut
  12.  
  13.  
  14. Function UTF8( myFileIn, myFileOut )
  15. ' UTF8()  Version 1.00
  16. ' Written by Rob van der Woude
  17. ' http://www.robvanderwoude.com
  18.  
  19.    Dim objStream
  20.  
  21.    ' Valid Charset values for ADODB.Stream
  22.    Const CdoBIG5        = "big5"
  23.    Const CdoEUC_JP      = "euc-jp"
  24.    Const CdoEUC_KR      = "euc-kr"
  25.    Const CdoGB2312      = "gb2312"
  26.    Const CdoISO_2022_JP = "iso-2022-jp"
  27.    Const CdoISO_2022_KR = "iso-2022-kr"
  28.    Const CdoISO_8859_1  = "iso-8859-1"
  29.    Const CdoISO_8859_2  = "iso-8859-2"
  30.    Const CdoISO_8859_3  = "iso-8859-3"
  31.    Const CdoISO_8859_4  = "iso-8859-4"
  32.    Const CdoISO_8859_5  = "iso-8859-5"
  33.    Const CdoISO_8859_6  = "iso-8859-6"
  34.    Const CdoISO_8859_7  = "iso-8859-7"
  35.    Const CdoISO_8859_8  = "iso-8859-8"
  36.    Const CdoISO_8859_9  = "iso-8859-9"
  37.    Const cdoKOI8_R      = "koi8-r"
  38.    Const cdoShift_JIS   = "shift-jis"
  39.    Const CdoUS_ASCII    = "us-ascii"
  40.    Const CdoUTF_7       = "utf-7"
  41.    Const CdoUTF_8       = "utf-8"
  42.  
  43.    ' ADODB.Stream file I/O constants
  44.    Const adTypeBinary          = 1
  45.    Const adTypeText            = 2
  46.    Const adSaveCreateNotExist  = 1
  47.    Const adSaveCreateOverWrite = 2
  48.  
  49.    On Error Resume Next
  50.  
  51.    Set objStream = CreateObject( "ADODB.Stream" )
  52.    objStream.Open
  53.    objStream.Type = adTypeText
  54.    objStream.Position = 0
  55.    objStream.Charset = CdoUTF_8
  56.    objStream.LoadFromFile myFileIn
  57.    objStream.SaveToFile myFileOut, adSaveCreateOverWrite
  58.    objStream.Close
  59.    Set objStream = Nothing
  60.  
  61.    If Err Then
  62.        UTF8 = False
  63.    Else
  64.        UTF8 = True
  65.    End If
  66.  
  67.    On Error Goto 0
  68. End Function

Saludos.


Título: Re: [BATCH] Edición archivo SRT
Publicado por: ovichan en 7 Agosto 2012, 11:36 am
Lo probare porque esto me va a llevar un rato, pero seguro que funciona. Muxas gracias por tomarte las molestias de ayudarme. Saludos


Título: Re: [BATCH] Edición archivo SRT
Publicado por: ovichan en 7 Agosto 2012, 16:34 pm
Probado sin exito total. Vamos que por lo que he observado se come este signo "!". He probado a cambiar los charset de ambos archivos, poniendos ambos en el mismo y sigue comiendoselos.

Te dejo los archivos en cuestion, no sea que estén mal.

https://dl.dropbox.com/u/19135067/Cap%2062%20B.srt

https://dl.dropbox.com/u/19135067/Modificando%20subs.bat

Saludos y gracias por adelantado.


Título: Re: [BATCH] Edición archivo SRT
Publicado por: Eleкtro en 7 Agosto 2012, 17:59 pm
Ayer probé de pasar con CHCP + Type un SRT en Unicode a ANSI y no perdiío el charset, Pero con el SRT que has subido no he tenido éxito, Así que mejor descarga esta APP:
http://www.gbordier.com/gbtools/stringconverter.htm

Código
  1. @echo off
  2. CHCP 1250 >NUL
  3.  
  4. For /R %%# in (*.srt) Do (stringconverter.exe "%%#" "%%~n#.ANSI%%~x#" /ANSI)
  5.  
  6. For /R %%# in (*ANSI.srt) Do (
  7. Echo Procesando archivo "%%~nx#"
  8. FOR /F "tokens=*" %%X in ('Type "%%#"') do (
  9. Echo "%%X"| findstr /R ".[^0-9]." >NUL || (Echo+ >> "%TEMP%\%%~nx#.srt")
  10. set "linea=%%X"
  11. Call :Replace
  12. Call Echo %%Linea_final%% >> "%TEMP%\%%~nx#.srt"
  13. )
  14. Type "%TEMP%\%%~nx#.srt" | more +1 > "%%~n#.MOD.%%~x#"
  15. Del /Q "%TEMP%\%%~nx#.srt", "%%~nx#"
  16. )
  17.  
  18. :Replace
  19. set "linea=%linea:. . .=...%"
  20. set "linea=%linea:¿ =¿%"
  21. set "linea=%linea:¡ =¡%"
  22. set "linea=%linea:Klilyn=Krilin%"
  23. set "linea=%linea:Ginew=Ginyu%"
  24. set "linea=%linea:>=^>%"
  25. set "linea=%linea:)=^)%"
  26. Set "Linea_final=%LINEA%"
  27. Goto:EOF
  28.  
  29.  

PD: No uses setlocal enabledelayedexpansion

Saludos


Título: Re: [BATCH] Edición archivo SRT
Publicado por: ovichan en 7 Agosto 2012, 20:53 pm
Gracias lo probable, esto es una tarea imposible.