lunes, 31 de julio de 2017

Cómo surgió la idea del Simple SRT Parser

Primero que nada, decir que el formato SRT es un formato para subtítulos de video.

La idea es tener los subtítulos como texto, no mapas de bits como lo son los subtítulos estándar de los DVD de video. Pueden estar en un archivo a parte, con extensión .srt o incrustados en el contenedor como otro stream.

Las ventajas son, por ejemplo, que al ser texto podemos ejecutar búsquedas. O, como ya hace youtube, podemos usar algún traductor automático para cambiarles el idioma de manera rápida. Aunque, como creo que el lector sabe bien, las traducciones automáticas todavía no son perfectas.

Bien, ahora la anécdota de cómo tuve la idea de hacer el parser.

Estaba consumiendo una serie de tutoriales (era más bien un mini-curso) en uno de esos sitios tipo Coursera o Udacity, cuando decido usar la opción que ofrecen de descargar el video. La idea era verlo en el celular mientras estaba en la cama, pues el WiFi de mi hogar a veces es inestable desde mi habitación.

Resulta que el video estaba en inglés. No puedo con el inglés hablado, pero no tengo problema con el escrito. Por lo cual los subtítulos son muy importantes para mí, venían en formato srt.

Ahora bien, parecía que la transcripción estaba hecha por uno de esos motores de reconocimiento de voz. Era bueno, pues al principio pensé que la había hecho un ser humano y no fue sino hasta que vi uno de esos errores típicos de estos programas que entendí que era automática (el sitio en cuestión empezó a poner al final de los videos el nombre de la persona que hace el subtítulo, así que no son automáticos).

Además, en el sitio mismo los subtítulos salían correctamente cuando tenían que salir, sincronizados con la persona que hablaba, pero por alguna razón mi reproductor multimedia (en realidad probé varios) superponía las líneas. Es difícil explicarlo, "superponía" no es exactamente lo que hacía, después veré si subo un gif animado mostrando el problema para que se entienda de qué hablo.

Entonces decidí abrir el archivo SRT con un editor de textos y tratar de descubrir cuál sería el problema. Resulta que las marcas de tiempo estaban mal, cada línea terminaba un poco después de que la siguiente comenzara, provocando este fenómeno que yo llamo "superposición".

Me puse a arreglar cada línea a mano, pero pronto decidí que eran demasiadas.

Así comencé a escribir este parser, intentando que estuviera correctamente generalizado pero sin apartarme demasiado de mi necesidad del momento.

La idea era que para hacer tareas sobre un archivo SRT era necesario tenerlo parseado y cargado en estructuras que facilitaran programar algoritmos. Esta estructura terminó siendo un simple objeto del tipo {number, show, hide, text}.

Si ven el código fuente, faltan algunas cosas, por ejemplo, la "clase" Time sólo tiene la función isGreaterThan() cuando, desde el punto de vista de la generalización, debería venir acompañada de isLesserThan(), isEqual() y así. Como yo no necesitaba las demás no las escribí tampoco, pero ya queda la idea para una próxima versión.

Implementar esa funcionalidad sería fácil, pues si miran en isGreaterThan verán que lo único que hace es convertir todo a segundos y luego comparar si es menor o mayor que el total de segundos de otro objeto que tenga las mismas propiedades que Time.

Ahora mientras escribo, me doy cuenta que podría haber inicializado un objeto Date para representar el tiempo recuperado del formato SRT, en vez de diseñar un objeto propio.

El formato SRT es fácil de entender. No busqué ninguna especificación, sólo deduje lo que era válido y no válido a partir de los SRT con los que probé el parser. El soporte para este formato puede estar incompleto, ya que no lo verifiqué demasiado, cosas que son correctas en un SRT válido podrían no serlo para el parser, pero dudo que se presente un caso así ya que, como dije, es muy simple el formato.

Por ahora, la única forma de usar el código fuente, es dar clic derecho y luego "Ver código fuente de la página". La parte reutilizable es la etiqueta script que está marcada con el comentario <!--library-->. usen CTRL+F para ir directo a ese comentario y saltarse todo el código de Blogger.

En realidad, terminé por implementar un botón de "Código fuente", al final de la documentación del parser. Cuando se le da clic muestra el código recuperado de la misma entrada del blog. No sé qué tan seguro sea hacerlo así pero lo prefiero a tener el código dos veces, así si lo actualizo no hay riesgo de olvidarme de actualizar la copia que se muestra al público.

Para los que sólo quieran hacer algo con algún SRT, y no les interese el código fuente, pueden usar la interfaz en la entrada del blog, que en su estado actual representa todo lo que el parser puede hacer hasta ahora. Deben copiar todo el contenido de su archivo SRT en la primera entrada de texto, configurar las opciones, y luego hacer clic en el botón "Procesar". El resultado se mostrará en la segunda entrada de texto, desde la cual podrán seleccionar y copiar para luego actualizar su SRT.

Sin más que decir, el parser y su demostración.

0 comentarios:

Publicar un comentario