본문 바로가기

Python

다운받은 유튜브 자막을 smi로 만들기

다운받은 유튜브 자막을 smi 자막파일로 만들어 보겠습니다.


이전 포스팅과 연관성이 있습니다.

http://stanleykou.tistory.com/entry/%EC%9C%A0%ED%8A%9C%EB%B8%8C-%EB%8F%99%EC%98%81%EC%83%81%EC%9D%98-%EC%9E%90%EB%A7%89%EC%9D%84-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%EB%B0%9B%EC%95%84%EB%B3%B4%EC%9E%90



다운로드 받은 유튜브 자막을 일단 텍스트 파일로 저장합니다.

script.txt


그리고 새로 파이썬 프로젝트를 하나 만들고, 그 안에 넣습니다.

프로젝트명은 YouTubeScriptToSmi 로 정했습니다.



아래 내용은 아래 사이트를 참고해서 작성되었습니다.

http://docs.python.org/2/tutorial/inputoutput.html


파일 읽기

파일 읽기는 아주 간단합니다. 아래 한 줄이 전부입니다.

scriptFile = open('script.txt', 'r')


한 줄은 시간, 한 줄은 자막

유튜브에서 받은 자막은 아래와 같은 형식입니다.

 0:01 

Ladies and gentleman, would you please welcome Chet Haase and Romain Guy.

한 줄씩 읽어들여야 시간정보와 자막정보를 구분할 수 있습니다.

그래서 아래와 같이 readline을 이용해서 한 줄씩 번갈아가며 파일을 읽어 들입니다.

time = scriptFile.readline()

caption = scriptFile.readline()

그런데...... 어떤 파일은 자막 부분이 없어서 에러가 나는군요. 그래서 해당 라인이 시간정보인지 판단해서 해당 처리를 해주는 부분을 구현합니다.



시간을 smi 초로 변환

smi는 millisec로 시간을 표시합니다. 그래서 분단위와 초단위를 구분한 뒤 millisec로 만들어줍니다.


    trimedString = timeString.strip()
    timeArray = trimedString.split(':')

    timeMinString = timeArray[0]
    timeSecString = timeArray[1]
    timeMin = int(timeMinString) * 60 * 1000    
    timeSec = int(timeSecString) * 1000
}


파일 쓰기

역시 아주 간단합니다. 열기 한 줄, 쓰기 한줄, 플러쉬 한 줄로 끝입니다.

convertedFile = open('converted.smi', 'w')

convertedFile.write("Hello world!\n");

convertedFile.flush();


전체 코드를 한 번 보겠습니다.

테스트 용으로 들어간 주석 처리된 코드는 무시하고 보시면 됩니다.


# -*- coding: utf-8 -*-

# determine is time or not
def isTime(strToTest):
    trimedString = strToTest.strip()    
    stringArray = trimedString.split(':')
        
    try:
        timeMin = int(stringArray[0])
    except ValueError:
        return False
    
    try:
        timeSec = int(stringArray[1])
    except ValueError:
        return False
    
    if len(stringArray) == 2:
        return True        
    else :
        return False
    return

# get time converted for smi  
def getConvertedTime(timeString):
    trimedString = timeString.strip()    
    timeArray = trimedString.split(':')
       
    timeMinString = timeArray[0]
    timeSecString = timeArray[1]
        
    timeMin = int(timeMinString) * 60 * 1000    
    timeSec = int(timeSecString) * 1000
    
    return str(timeMin + timeSec);
    
# common header
def getHeader():
    return "SMI"

# common footer
def geFooter():
    return ""


print "Start"

# Read whole file and print
# scriptFile = open('script.txt', 'r')
# print scriptFile.read()

# Read and print whole text file line by line
# scriptFile = open('script.txt', 'r')
# for line in scriptFile :
#    print "read :" + line

# Read and convert, write to file
scriptFile = open('script.txt', 'r')
convertedFile = open('converted.smi', 'w')
convertedFile.write(getHeader() + "\n");

while True:    
    stringToTest = scriptFile.readline()    
    if (isTime(stringToTest)):
        # time           
        time = stringToTest        
        if not time:
            break
#이 부분은 태그 때문에 에러가 나는군요...... 부득이하게 캡쳐 파일로 대신합니다. 줄은 잘 맞춰서 쓰시기 바랍니다.



 

    else :  
        # caption
        caption = stringToTest
        if not caption:
            convertedFile.write("\n");
            break;
        convertedFile.write(caption + "");    

convertedFile.write(geFooter());
convertedFile.flush();

print "End"
}


이렇게 파이썬을 이용하여 간편하게 파일을 수정할 수 있습니다.


최종 파일입니다.


YouTubeScriptToSmi.py



끝!