smi to srt 자막파일 자동생성 구현

박남규   
   조회 48512   추천 9    

nkcrontab.sh (1.8K), Down : 307, 2013-05
nksmi2srt.sh (5.7K), Down : 316, 2013-05

유닉스든 리눅스든 기반(시놀로지, 넷기어 등)으로 하고 있는 NAS상에서
smi 자막을 자동으로 srt 자막으로 생성해주는 방법에 대해서 구현해봤습니다.
C언어나 PERL등 다른 랭귀지를 써도 되지만,
컴파일이 안되는 환경도 있고,
패키지 형태로 변환어플을 설치할수도 있는데,
간혹 smi 자막이 비표준화되어 오류가 나서 변환이 안되는 경우도 봤습니다.
하여, 구현이 쉬운 쉘스크립트를 사용해서 직접 만들어 봤습니다.
시놀로지를 예로 들어서 설명드리겠습니다.
 
1. SSH 설정
시놀로지 관리패널 / 제어판 / 터미널
SSH 서비스 활성화 체크
 
2. root 접속
putty나 secureCRT 등으로 root 계정으로 접속
비밀번호는 admin 계정의 비밀번호와 동일
 
3. 볼륨밑에 root홈생성(root 홈과 별개임)
mkdir /volume1/homes/root
 
4. nkcrontab.sh 생성
vi /volume1/homes/root/nkcrontab.sh
아래 내용을 입력후 저장 또는 첨부파일참조
 
#!/bin/sh
#
echo "################################################"
echo "# SMI to SRT convertor crontab ver 1.0          "
echo "# Created date: 2013.01.17                      "
echo "# Creator info: http://www.nkpark.pe.kr         "
echo "################################################"
targetdir=/volume1/video
workdir=/volume1/homes/root               
workfile=${workdir}/nksmi2srt.work                         
find ${targetdir} -name "*.smi" -exec ls {} \; > ${workfile}
                               
nkline=`cat ${workfile} | wc -l`
i=1 
iok=0
sok=0
eok=0                      
while [ ${i} -le ${nkline} ]
do              
    read filename                                                                            
    echo "[${i}]-----------------------------------------------------------------------------"
    echo "input: ${filename}"                                         
    ofilename=`dirname "${filename}"`/`basename "${filename}" .smi`.srt
    echo "ouput: ${ofilename}"
                           
    if [ -f "${ofilename}" ]
    then                   
       sok=`expr ${sok} + 1`
       echo "--> Skip....."
    else                                                           
       ${workdir}/nksmi2srt.sh "${filename}" "${ofilename}"        
       if [ -f "${ofilename}" ]
       then                   
          iok=`expr ${iok} + 1`          
          echo "--> Change Completed!!!!!"
       else                   
          eok=`expr ${eok} + 1`      
          echo "--> Change Error....."
       fi
    fi              
    i=`expr ${i} + 1`
done < ${workfile}
i=`expr ${i} - 1`                                                                       
echo "----------------------------------------------------------------------------------"
echo "## Total: ${i}, Skip: ${sok}, Changed: ${iok}, Error: ${eok}"
 
5. nkcrontab.sh 실행권한
chmod 777 /volume1/homes/root/nkcrontab.sh
 
6. nksmi2srt.sh 생성
vi /volume1/homes/root/nksmi2srt.sh
아래 내용을 입력후 저장 또는 첨부파일참조
 
#!/bin/sh
#
##echo "################################################"
##echo "# SMI to SRT convertor shell program ver 1.2    "
##echo "# Created date: 2013.05.29                      "
##echo "# Creator info: http://www.nkpark.pe.kr         "
##echo "################################################"
if [ "$#" -ne 2 ]
then
   echo "Usage) $0 smi_file srt_file"
   echo ""
   exit
fi
echo "[`date '+%Y-%m-%d %H:%M:%S'`] Started"
smi_file=$1
srt_file=$2
start_active_toggle=0
tag_active_toggle=0
file_active_toggle=0
copy_active_toggle=0
main_content=
tag_content=
my_time_result=
srt_i=1
i=1
time_calc()
{
    my_time_parsed=$1
    time_remain=${my_time_parsed}
    time_1=00`expr ${time_remain} / 3600000`
    str_st=`expr ${#time_1} - 1`
    time_1=`expr substr "${time_1}" ${str_st} 2`
    time_remain=`expr ${time_remain} % 3600000`
    time_2=00`expr ${time_remain} / 60000`
    str_st=`expr ${#time_2} - 1`
    time_2=`expr substr "${time_2}" ${str_st} 2`
    time_remain=`expr ${time_remain} % 60000`
    time_3=00`expr ${time_remain} / 1000`
    str_st=`expr ${#time_3} - 1`
    time_3=`expr substr "${time_3}" ${str_st} 2`
    time_4=`expr ${time_remain} % 1000`
   
    time_result="${time_1}:${time_2}:${time_3},${time_4}"
    ##echo ${time_result}
}
tag_content_calc()
{
    my_tag_content=$1
    ## <BODY>태그부터 작업시작인데, <BODY>태그가 없는 경우의 처리를 위해서 <SYNC>태그 부터 작업시작
    my_check=`echo "${my_tag_content}" | grep -i "<SYNC START=" | wc -l`
    if [ ${my_check} -eq 1 ]
    then
        time_parsed=`echo "${my_tag_content}" | cut -f 2 -d "=" | cut -f 1 -d ">"`
        time_calc "${time_parsed}"
       
        if [ ${start_active_toggle} -eq 0 ]
        then
            my_time_from="${time_result}"
            my_time_to="${time_result}"
            my_time_result="${my_time_from} --> ${my_time_to}"
            start_active_toggle=1
        else
            my_time_from="${my_time_to}"
            my_time_to="${time_result}"
            my_time_result="${my_time_from} --> ${my_time_to}"
            my_check=`echo "${my_all_content}" | grep -i "&nbsp;" | wc -l`
            if [ "${my_all_content}" != "" ] && [ ${my_check} -ne 1 ]
            then
                if [ ${file_active_toggle} -eq 0 ]
                then
                    echo "" > "${srt_file}"
                    file_active_toggle=1
                fi
                ##if [ ${copy_active_toggle} -eq 0 ]
                ##then
                ##    copyrights head
                ##    copy_active_toggle=1
                ##fi
               
                echo "${srt_i}" >> ${srt_file}
                echo "${my_time_result}" >> ${srt_file}
                echo "${my_all_content}" >> ${srt_file}
                echo "" >> ${srt_file}
                srt_i=`expr ${srt_i} + 1`
            fi
            my_all_content=
        fi
       
        ##echo ${my_time_result}
    fi
    ## <BR>태그는 \n(행바꿈)으로 치환
    my_check=`echo "${my_tag_content}" | grep -i "<BR>" | wc -l`
    if [ ${my_check} -eq 1 ]
    then
        ##main_content="${main_content}\n"
        ##main_content=`echo "${main_content}" | tr '<BR>' '\n' | tr '<br>' '\n' | tr '<Br>' '\n' | tr '<bR>' '\n'`
        main_content=`echo "${main_content}" | sed 's/<BR>/\n/g' | sed 's/<br>/\n/g' | sed 's/<Br>/\n/g' | sed 's/<bR>/\n/g'`
    fi
    
    ##echo "${my_tag_content}"
}
main_content_calc()
{
    my_main_content=$1
    if [ ${start_active_toggle} -eq 1 ]
    then
        ##my_main_content=`echo "${my_main_content}" | tr -d '\f\r\n'`
        my_main_content=`echo "${my_main_content}" | sed 's/\f//g' | sed 's/\r//g' | sed 's/\n//g' | sed 's/^M//g'`
        my_all_content="${my_all_content}${my_main_content}"
    fi
}
copyrights()
{
    cr_flag=$1
    if [ "${cr_flag}" == "head" ]
    then
        cr_time_from="00:00:00,500"
        cr_time_to=${my_time_from}
    else
        time_calc `expr ${my_time_parsed} + 10000`
        ##cr_time_from=${my_time_to}
        cr_time_from=${time_result}
        time_calc `expr ${my_time_parsed} + 5000`
        cr_time_to=${time_result}
    fi
   
    cr_time_result="${cr_time_from} --> ${cr_time_to}"
    echo "${srt_i}" >> ${srt_file}
    echo "${cr_time_result}" >> ${srt_file}
    echo "<I>이 SRT 자막은</I> <B>박남규</B><I>가 만든 프로그램으로 변환함</I>" >> ${srt_file}
    echo "<U><FONT COLOR=\"blue\">http://www.nkpark.pe.kr</FONT></U>" >> ${srt_file}
    echo "" >> ${srt_file}
    srt_i=`expr ${srt_i} + 1`
}
nkline=`cat "${smi_file}" | wc -l`
while [ ${i} -le ${nkline} ]
do
    read line_input
               
    li_len=`expr length "${line_input}"`
    c=1
    while [ ${c} -le ${li_len} ]
    do
        char_parsed=`expr substr "${line_input}" ${c} 1`
        case ${char_parsed} in
          \<)
             if [ `expr length "${main_content}"` -gt 0 ]
             then
                 ##echo $main_content
                 main_content_calc "${main_content}"
                 main_content=
             fi
             tag_active_toggle=1
             ;;
          \>)
             tag_content="${tag_content}${char_parsed}"
             if [ `expr length "${tag_content}"` -gt 0 ]
             then
                 ##echo $tag_content
                 tag_content_calc "${tag_content}"
                 tag_content=
             fi
             tag_active_toggle=0
             ;;
           *)
             if [ ${tag_active_toggle} -eq 0 ]
             then
                 main_content="${main_content}${char_parsed}"
             fi
             ;;
        esac
        if [ ${tag_active_toggle} -eq 1 ]
        then
            tag_content="${tag_content}${char_parsed}"
        fi
        c=`expr ${c} + 1`
    done
           
    i=`expr ${i} + 1`
done < "${smi_file}"

if [ ${start_active_toggle} -eq 1 ]
then
    copyrights tail
fi
if [ -f ${srt_file} ]
then
    chmod 666 ${srt_file}
fi
echo "[`date '+%Y-%m-%d %H:%M:%S'`] Finished"

7. nksmi2srt.sh 실행권한
chmod 777 /volume1/homes/root/nksmi2srt.sh
 
8. crontab 설정
vi /etc/crontab
마지막 행에 아래 내용을 추가(1시간마다 실행)

## created by N.K Park
0 */1 * * * /volume1/homes/root/nkcrontab.sh > /volume1/homes/root/nkcrontab.log
 
9. crontab 재시작
synoservice -restart crond

여기까지 하시면, /volume1/video 밑에 있는 모든 폴더나 파일등
1시간마다 체크하여(8번에서 수정가능)
smi파일과 srt파일이 쌍으로 있으면 skip하고, 
smi파일만 있는 것은 srt파일을 자동으로 생성합니다...
 
*** 본문수정(5.11일) 6번 nksmi2srt.sh version 1.0 -> 1.1 수정
빨간색으로 되어있는 sed 명령어 맨 마지막에서 ^M은 vi 편집기상에서 Ctrl+V 누르고 엔터키를 친 것입니다.
붙여넣기 하시면 안되니, 첨부파일을 참고하세요.
sed명령어로 완벽하게 작동합니다.
*** 본문수정(5.29일) 6번 nksmi2srt.sh version 1.1 -> 1.2 수정
srt 파일에 대해서 chmod 666 지정
***
 
첨부로 쉘스크립트 파일도 같이 올립니다...
 
짧은글 일수록 신중하게.
f100mania 2013-05
감사합이다.^^ 잘 됩니다.
ghostman 2013-05
자세한설명, 귀한정보 감사합니다.
김성태 2013-05
귀한정보 감사합니다.  리눅스를 잘 몰라서 당장은 사용하기 힘들겠지만....^^
언젠가는 저두 사용할듯합니다.
     
성승호 2013-05
리눅스를 잘 모르는 사람을 위해서 만들어 주신 것입니다. 그대로 따라하시면 됩니다.
박남규 2013-05
6. nksmi2srt.sh 버전 업 되었습니다.
tr명령어를 sed명령어로 바꿨습니다.
시놀로지에서 완벽하게 작동합니다.
만일, 다른 리눅스에서 사용하신다면
#!/bin/sh -> #!/bin/ksh 로 수정해서 사용하시면 됩니다...
정안렬 2013-05
*비밀글입니다
삶의축제 2013-05
xnology 4.2 3202build 사용중입니다.
첨부파일로 진행하였는데 변환이 안되는데 무슨 문제일까요?
터미널에서 명령어를 입력하면 변환은 가능합니다.

shell을 확인해보니 ash 쉘이네요.
     
이상은eva 2013-05
흠 스케줄에 등록하니 되는데요.
     
박남규 2013-05
아마도 특수문자가 크론에 들어간 듯 합니다.
크론탭을 vi 편집기로 열어서 보시면
vi /etc/crontab
0 */1 * * * /volume1/homes/root/nkcrontab.sh > /volume1/homes/root/nkcrontab.log^M
이런식으로 줄 마지막에 ^M이 붙어있을 수 있습니다.
DOS형식으로 저장을 시키면 이렇게 됩니다.
마지막 ^M 특수문자를 삭제하시고, 해보시기 바랍니다.

그리고, 크론에 걸었다고 바로 즉시 수행이 아니라
위의 경우 1시간 후 부터 실행이 됩니다...
박문수 2013-05
감사합니다.
시놀리지에서 작업 스케줄에 등록하면 되네요.
터미널 들어가지 않고 등록 되어서 편한듯 ^^
최형철 2013-05
추천합니다.
하나 보강해주세요
파일이 만들어질때 권한이 644 권한이네요 파일 만들고 나서 666 으로 chmod 해줘야 할듯 합니다.
^^
     
박남규 2013-05
최형철님, 의견대로 chmod 적용했습니다.
          
최형철 2013-05
srt파일 뿐만 아니라 워크 파일도 666 권한 설정이 필요할듯 합니다.
그리고 저렇게 cron에 등록하는것보다.
synology에 작업 스케줄러에 등록하는것이 더 좋을듯하네요.^^
조태용 2013-05
귀한자료 감사합니다.
바로 적용했어요~
구룸구룸 2013-09
1. nkcrontab.sh , nksmi2srt.sh 다운로드
2. nkcrontab.sh 에서 자신에 맞게 설정
      targetdir=/volume2/video              # 비디오스테이션 라이브러리 저장 폴더
      workdir=/volume1/homes/admin    # 저는 root가 없어서 있는 admin으로 지정했습니다.
3. /volume1/homes/admin 에 두 파일을 복사
4. 제어판 > 작업 스케줄러 > 생성 > 사용자 정의 스크립트 > 일반
5. 작업 : 자막생성
  사용자 : admin
  실행명령
        /volume1/homes/admin/nkcrontab.sh > /volume1/homes/admin/nkcrontab.log
6. 제어판 > 작업 스케줄러 > 생성 > 사용자 정의 스크립트 > 스케줄
    날짜 : 매일
    시간 : 매 1시간
    ...
7. 확인
8. 생성된 작업을 선택한 후 실행 버튼 클릭

정상적으로 작업이 완료되었으면 .srt 파일이 각자의 라이브러리 폴더에 추가되었을 겁니다.

그러나 자막이 생성된 것은 좋았으나 자막이 영상의 밑에 출력이 되어서 전체화면으로 못 봅니다. 이거 어떻게 해야 하나요?
     
박남규 2014-02
자막생성과 영상밑에 출력되는 것은 무관해보입니다.
player의 자막 출력 옵션을 살펴보셔야 할 듯 합니다.
김영화 2013-12
syntax error 가 나오네요... 이건 무엇을 의미하는건가요?
일단 첨부파일 다운받아서 /homes/root 디랙토리 만들어서 거기에 첨부파일 2개 넣어놨구여
crontab 등록은 안했구요. 변환이 잘되나 테스트 해볼려구
/volume1/homes/root> ./nkcrontab.sh
위와 같이 실행하였더니 syntax error 라고 계속 뜨네요.
어떻게 문제해결을 해야될지 초보라 자세히 설명좀 부탁 드립니다.
참고로.시놀로지 사용 하고 있습니다.
아참. 그리고 sed 명령어는 변환하는거랑 관계가 잇는건가요?
검색해보니까 그냥 editor 같던데요. 같이 어떤식으로 병행해서 써야되는건지도 좀 가르쳐 주세요
     
박남규 2014-02
syntax error는 경로 설정을 다시 체크해보시기 바랍니다.
그리고, sed명령어는 변환하는 것과 관련있으며,
위 내용대로, 안내한대로 사용하시면 됩니다.
김규리 2014-01
작업 스케줄러에 등록할 때
일반 탭에서는
작업: smi > srt 자막 변환
사용자: root
실행명령: /volume1/homes/root/nkcrontab.sh > /volume1/homes/root/nkcrontab.log

스케줄 탭에서는
원하는 시간 등록하면

crontab 하는거랑 똑같나요? 이렇게 스케줄러 하는거 맞는건지요?
김규리 2014-01
작업하실때 GUI UI인 WinSCP 를 사용해서 하는게 더 편리하네요. putty보다요.
최현우a 2014-02
귀한자료 감사합니다..^^;
이준원 2014-03
감사합니다. 잘 동작하네요^^
도로로33 2015-03
감사합니다.
아담사과 2015-05
귀한 자료 감사합니다.
둘리이 2015-10
한 번 실행하면 cpu 가 100으로 올라가서 도통 내려오지 않네요.
nksmi2srt.sh 가 프로세스에 계속 남아 있던데... 원래 그런 건가요?
무한루프라도 돌고 있는 건 아닌지...
오렌지송 2018-12
타켓 폴더를 여러개 지정하려면 어떻게 입력해야 하나요 ?~




NAS
제목Page 271/274
2014-04   3160832   회원K
2014-05   3484495   정은준1
2013-05   14020   송강민
2013-05   22600   안형곤
2013-05   26867   똥파리
2013-05   28240   정은준1
2013-05   19833   JFK4
2013-05   48513   박남규
2013-05   34138   sensekuh
2013-05   21597   프리즘볼
2013-05   58344   Ryun
2013-05   13228   f100mania
2013-05   13094   굴다리교
2013-04   15266   프리즘볼
2013-04   20161   Ryun
2013-04   8918   윤석영1
2013-04   8288   Suhyeoni
2013-04   12361   자바라
2013-04   13383   SkyBase
2013-04   7148   데이비드
2013-04   18741   안형곤
2013-04   12731   witniss