Alba on Tech

Talking about technology

Un scriptillo para renombrar subtítulos

Una de las formas más agradables de aprender inglés es viendo series en inglés. Y como reconozco que mi oido no es lo bueno que debería ser, me apoyo en subtítulos (también en inglés). Pero para que el reproductor muestre el subtítulo adecuado, tanto el archivo de vídeo como el de subtítulos deben tener el mismo nombre, con distinta extensión.

Pues bien, de tantas veces que he tenido que hacerlo, he llegado a odiar la operación de renombrado. Así que he decidido solucionarlo de una vez por todas, y he hecho un script que busca todos los archivos de video de un directorio, extrae el número de temporada y capítulo, y busca un archivo de subtítulo para esa temporada y capítulo. El truco es que hay varias formas de nombrar los archivos. Por ejemplo, para la temporada 3, capítulo 12, pueden ser S03E12, 03×12, o 3×12. Total, que he jugueteado un poco con las expresiones regulares, y he decidido publicarlo aquí por si le viene bien a alguien.

Eso sí, está hecho en groovy. Seguro que la versión de python aparece en los comentarios en breve…

#!/usr/bin/groovy

import java.util.regex.Matcher
import java.util.regex.Pattern

/**
 * Get the episode number as a map os season and episode
 * Detect the number of the formats S03E05, 03x05, or 3x05
 */ 
def getEpisodeNumber(name){
    def number = [:]
    def regExp = /S[0-9][0-9]E[0-9][0-9]/
    def matcher = ( name =~ regExp )
    def num = matcher[0]
    if (num){
        number.season = num[1]+num[2]
        number.episode = num[4]+num[5]
        return number
    } 
    
    regExp = /[0-9][0-9]x[0-9][0-9]/
    matcher = ( name =~ regExp )
    num = matcher[0]
    if (num){
        number.season = num[0]+num[1]
        number.episode = num[3]+num[4]
        return number
    } 
    
    regExp = /[0-9]x[0-9][0-9]/
    matcher = ( name =~ regExp )
    num = matcher[0]
    if (num){
        number.season = num[0]
        number.episode = num[2]+num[3]
        return number        
    } 
    
        
}

/**
 * List the video files of the directory.
 * Video files are those with extension avi, mp4 or mkv
 */ 
def listFiles(){
    def files = []
    new File('.').eachFileMatch(~/^.*\.(avi|mp4|mkv)$/) { files << it.name }
    return files
}

/**
 * Search for the name of the subtitle file for this episode number
 * @param number A map of season and episode
 */ 
def findSubtitleFile(number){
    def files = []
    
    
    
    new File('.').eachFileMatch(~/^.*S${number.season}E${number.episode}.*\.srt$/) { files <0){
        return files[0]
    }
    
    new File('.').eachFileMatch(~/^.*${number.season}x${number.episode}.*\.srt$/) { files <0){
        return files[0]
    }
    
    if (number.season[0]=='0'){
        new File('.').eachFileMatch(~/^.*${number.season[1]}x${number.episode}.*\.srt$/) { files <0){
            return files[0]
        }
    }
    
 
    
    return null
}


//Main feature
//For each video file, find it's subtitle file, and rename it
listFiles().each{ name ->
    def n = getEpisodeNumber(name)    
    def subtitle = findSubtitleFile(n)
    if (subtitle){
        def newName = name[0..-4]+"srt"
        assert new File(subtitle).renameTo(new File(newName))
    }
}
Advertisements

2 June, 2012 - Posted by | Programación

No comments yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: