Package

~/.local/bin/smitosrt.sh

Rina Kawakita 2019. 12. 26. 22:44
~/.local/bin/smitosrt.sh
#!/bin/sh
# 1. (utf-8 or non-utf-8) smi 자막을, 최종 BOM 없는 UTF-8 FILENAME.kor.srt 자막 파일 생성, 기존 smi 파일은 유지
# 2 통합자막 처리 방식
#   2-1 원본 smi -> .dou백업,    원본 smi 1차 가공본 -> .douu(smi) 백업
#   2-2 원본 smi -> .kor.spl  .eng.spl 로 분할
#   2-3 kor.spl => .smi로 저장.-> .smi->kor.srt 변환(기 존재시 패스) -> 변환실패시 .dou -> .smi로 원상 복구
#   2-4 eng.spl => .spl->eng.srt 변환(기 존재시 패스) -> eng.spl 삭제
#   2-5, 통합자막이 적절하게 분할 되지 못하면, 디플트 방식 디폴트 1번 -> kor.srt 파일에 한글 영어 번걸아서 나타남
# emby server, plex server에서 그럭저럭 잘 작동함
# 의존성 패키지 : ffmpeg

FILEPATH="$1"
# FILEPATH=/run/media/nietz/data_02/sickrage/
#FILEPATH="/run/media/nietz/data_01/media/Movie/en/The Twilight Collection/[2008] The.Twilight.1080p.BluRay.DTS.x264"
# /run/media/nietz/data_01/media/TV/en             # FILEPATH 폴더 이하의 모든 smi 자막을을 변환. 경로 수정 요망 
#FILEPATH=$HOME/Desktop                                   # FILEPATH 폴더 이하의 모든 smi 자막을을 변환. 경로 수정 요망 
SMILOG=$HOME/smiLog.txt                                   # 변환대상 목록
FAILLOG=$HOME/smiFailLog.txt                              # 변환실패 목록
DOULOG=$HOME/DouLog.txt                                   # 통합자막 백업 목록
TEMPFILE=/tmp/temp.tmp

cd /
if [ -f $SMILOG ]; then
  rm $SMILOG;
fi

if [ -f $FAILLOG ]; then
  rm $FAILLOG;
fi

if [ -f $DOULOG ]; then
  rm $DOULOG;
fi

echo 
echo -e "\e[90m --------------------"
echo -e "\e[91m 통합자막 백업 목록  "
echo -e "\e[90m --------------------\e[0m"
echo 
printf "[통합자막 백업 목록]\n\n" > $DOULOG;
find "$FILEPATH" -name *.smi -size +50k | sort -n | while read FILENAME          # 사이즈 100K 이상을 통합자막이라 1차 가정
  do name=`echo "${FILENAME%.*}"`;                          # 확장자 제거한 파일 path
    if [ -f "${name}".dou ]; then                           # 기 .dou 파일이 존재하면 패스(덮어쓰지 않는다)
        :
    else
      cp "${FILENAME}" "${name}".dou;                       # 100K 넘는 원본.smi를 .dou로 백업
    fi
    #FILESIZE=$(ls -al ${FILENAME} | awk '{ print $5 }');
    sed -i 's/KR>/KRCC>/g' "${FILENAME}";                   # xx,xx KRCC로 치환
    sed -i 's/KRCCCC>/KRCC>/g' "${FILENAME}";               # 추가 요망 ㅠ.ㅠ
    sed -i 's/EN>/ENCC>/g' "${FILENAME}";                   # xx,xx ENCC로 치환
    sed -i 's/ENCCCC>/ENCC>/g' "${FILENAME}";
    sed -i 's/EGCC>/ENCC>/g' "${FILENAME}";
    sed -i 's/
//g' "${FILENAME}";                         # 1. Dos를 Unix로 바꿔주고 (캐리지리턴제거), for perl excute
    # white space 제거 : 1-좌측트림,2-우측트림,3-empty라인제거,4-1+2+3
    sed -i 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' "${FILENAME}";
    perl -pi -e 's/KRCC>\n/KRCC>/' "${FILENAME}";           # 2. tag라인과 content 라인을 1라인으로 이어붙인다.
    perl -pi -e 's/ENCC>\n/ENCC>/' "${FILENAME}";           #
    perl -pi -e 's/
\n/
/' "${FILENAME}"; # #if [ $FILESIZE -ge 102400 ] && \ # KRCC, ENCC가 동시에 나타나면 통합 자막이라 2차 가정 if [ $(egrep -ic "krcc" "${FILENAME}") -ge 2 ] && [ $(egrep -ic "encc" "${FILENAME}") -ge 2 ]; then echo "통합자막: ${FILENAME}"; while read READLINE # *.kor.sql, *.eng.spl 파일 2개로 분할한다 do # 문법을 잘 몰라 그냥 한라인씩 받아서 파일로 생성 ㅠ.ㅠ. if [ -f "$TEMPFILE" ]; then rm "$TEMPFILE"; fi echo "$READLINE" >> $TEMPFILE; if (grep -iq "ko-kr" "$TEMPFILE") || (grep -iq "krcc>" "$TEMPFILE") then echo "$READLINE" >> "${name}.kor.spl"; elif (grep -iq "en-us" "$TEMPFILE") || (grep -iq "encc>" "$TEMPFILE") then echo "$READLINE" >> "${name}.eng.spl"; else echo "$READLINE" >> "${name}.kor.spl"; echo "$READLINE" >> "${name}.eng.spl"; fi done < "${FILENAME}" mv "${FILENAME}" "${name}.douu"; # 원본자막에서 변조된 통합자막 smi를 .douu로 백업 mv "${name}.kor.spl" "${FILENAME}"; # 분할한 kor.spl를 자막.smi 로 변경 echo "${name}".douu >> $DOULOG; # 통합자막목록(.douu 파일과 같이 존재하는 .dou 파일이 실제 원본 통합자막 파일ㅇ) fi done if [ -f "$TEMPFILE" ]; then rm "$TEMPFILE"; fi find "$FILEPATH" -name *.smi | sort -n | while read FILENAME # FILEPATH 이하 디렉토리들의 smi 자막 파일들을 일괄 do name=`echo "${FILENAME%.*}"`; # 확장자 제거한 파일 path echo "${FILENAME}" >> $SMILOG; if [ -f "${name}".kor.srt ]; then # 기 kor.srt 파일이 존재하면 패스 echo "${name}.kor.srt [건너띰]" >> $SMILOG; else if file "${FILENAME}" | grep -qi "utf" # UTF 파일이면(utf-8,utf-16,utf-32) then ffmpeg -hide_banner -i "${FILENAME}" "${name}".kor.srt > /dev/null; #UTF smi를 utf-8 *.kor.srt로 변환 생성 echo echo "[변환됨] ${name}.kor.srt" >> $SMILOG; else # utf-8 이 아니면 non-utf-8(euc-kr, euc-jp, binary 등등) # cp949(>euc-kr) smi 파일이라 가정하고 utf-8 srt로 변환 # 완전 잘못된 문법의 smi 자막 파일인 경우 ffmpeg command 실행시 파싱 에러 -> 변환 실패함 # 수작업으로 smi 파일 수정 요망, 확률상,경험적으론 대다수의 경우는 잘 작동 ffmpeg -hide_banner -sub_charenc cp949 -i "${FILENAME}" "${name}".kor.srt > /dev/null; echo echo "[변환됨] ${name}.kor.srt" >> $SMILOG; fi sed -i 's/ //g' "${name}".kor.srt; #   제거 #sed -i 's/<\/b>//g' "${name}".kor.srt; # 제거 sed -i 's/<\/font><\/i><\/font>/<\/i><\/font>/g' "${name}".kor.srt; sed -i 's/
/\r/g' "${name}".kor.srt; #
을 줄바꿈으로 치환 sed -i 's/^\s\+//g' "${name}".kor.srt; # 문장처음에 나오는 공백문자들 제거 sed -i 's/ //g' "${name}".kor.srt; # 캐리지리턴문자 문장끝의 제거 ( = 박사 붙여넣기가 아닌 CTRL + v + m으로 입력) #sed -i '1 s/^\xef\xbb\xbf//' "${name}".kor.srt; # UTF-8 BOM 제거, 위과정에서 이미 제거됨 # 통합자막의 eng.spl -> .eng.srt 변환 생성 if [ -f "${name}".eng.spl ];then if [ -f "${name}".eng.srt ]; then echo "${name}.eng.srt [건너띰]" >> $SMILOG; else if file "${name}.eng.spl" | grep -qi "utf" # UTF 파일이면(utf-8,utf-16,utf-32) then ffmpeg -hide_banner -i "${name}.eng.spl" "${name}".eng.srt > /dev/null; #UTF smi를 utf-8 *.kor.srt로 변환 생성 echo echo "[변환됨] ${name}.eng.srt" >> $SMILOG; else # utf-8 이 아니면 non-utf-8(euc-kr, euc-jp, binary 등등) # cp949(>euc-kr) smi 파일이라 가정하고 utf-8 srt로 변환 # 완전 잘못된 문법의 smi 자막 파일인 경우 ffmpeg command 실행시 파싱 에러 -> 변환 실패함 # 수작업으로 smi 파일 수정 요망, 확률상,경험적으론 대다수의 경우는 잘 작동 ffmpeg -hide_banner -sub_charenc cp949 -i "${name}.eng.spl" "${name}".eng.srt > /dev/null; echo echo "[변환됨] ${name}.eng.srt" >> $SMILOG; fi sed -i 's/ //g' "${name}".eng.srt; #   제거 #sed -i 's/<\/b>//g' "${name}".eng.srt; # 제거 sed -i 's/<\/font><\/i><\/font>/<\/i><\/font>/g' "${name}".eng.srt; sed -i 's/
/\r/g' "${name}".eng.srt; #
을 줄바꿈으로 치환 sed -i 's/^\s\+//g' "${name}".eng.srt; # 문장처음에 나오는 공백문자들 제거 sed -i 's/ //g' "${name}".eng.srt; # 캐리지리턴문자 문장끝의 제거 ( = 박사 붙여넣기가 아닌 CTRL + v + m으로 입력) #sed -i '1 s/^\xef\xbb\xbf//' "${name}".eng.srt; # UTF-8 BOM 제거, 위과정에서 이미 제거됨 rm "${name}.eng.spl"; fi fi fi done echo echo -e "\e[90m --------------------" echo -e "\e[91m 변환 실패 목록 " echo -e "\e[90m --------------------" echo printf "[변환 실패 목록]\n\n" > $FAILLOG; find "$FILEPATH" -name *.kor.srt -size -5k | sort -n | while read FILENAME do name=`echo "${FILENAME%.kor.*}"`; # 확장자 제거한 파일 path echo "${name}".smi >> $FAILLOG; # 해당 smi 파일 수작업 수정 필요 delFile="${FILENAME}"; echo -e "\e[90m$delFile \e[91m삭제함"; rm "${delFile}"; if [ -f "${name}".dou ];then # 통합자막 분할된.kor.spl를 kor.srt로 변환실패시 *.dou 백업본을 *.smi 로 원상복구함 mv -f "${name}".dou "${name}".smi; # 통합자막이 적절하게 분할 되지 않았을 시 kor.srt 파일에 한글.영문이 나타남 (ffmpeg smi->srt 디폴트 변환) fi done