~/.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