본문 바로가기
쓸만한 글

시놀로지에서 자막파일 smi 에서 srt 파일로 자동변환해주기

by Cito citopes 2016. 1. 19.
반응형

"

nkcrontab.sh


nksmi2srt.sh

NASCafe - NAS 클라우드 활용자모임 No.1 나스카페"에서 퍼온자료입니다.

xpenol에서 정상작동 확인했습니다.





유닉스든 리눅스든 기반(시놀로지, 넷기어 등)으로 하고 있는 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

    ## 태그부터 작업시작인데, 태그가 없는 경우의 처리를 위해서 태그 부터 작업시작

    my_check=`echo "${my_tag_content}" | grep -i ""`

        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 " " | 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

    ## 

태그는 \n(행바꿈)으로 치환

    my_check=`echo "${my_tag_content}" | grep -i "

" | wc -l`

    if [ ${my_check} -eq 1 ]

    then

        ##main_content="${main_content}\n"

        ##main_content=`echo "${main_content}" | tr '

' '\n' | tr '

' '\n' | tr '

' '\n' | tr '

' '\n'`

        main_content=`echo "${main_content}" | sed 's/

/\n/g' | sed 's/

/\n/g' | sed 's/

/\n/g' | sed 's/

/\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 "이 SRT 자막은 박남규가 만든 프로그램으로 변환함" >> ${srt_file}

    echo "http://www.nkpark.pe.kr" >> ${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 지정

*** 



첨부로 쉘스크립트 파일도 같이 올립니다...

[출처] 거의 모든 나스에서 smi 자막 자동으로 srt로 변환하는 스크립트 (NASCafe - NAS 클라우드 활용자모임 No.1 나스카페) |작성자 태랑

댓글1

  • 장훈 2021.07.12 11:32

    안녕하세요. 시간이 오래 지났지만 올려주신 글 참고하여 잘 세팅했습니다~

    그런데 원래 자막 파일 하나 변환하는데 시간이 어느정도 걸리는가요? 지금 130kByte짜리 자막 하나 변환하는데 거의 30분 정도가 걸리네요... 원래 이 정도 시간 걸리는게 맞는건가요?
    답글