From b2f2f7d86e6016c82f75549bc181b5c5a06f436a Mon Sep 17 00:00:00 2001 From: Emily Frost Date: Tue, 14 Jun 2022 14:24:27 -0500 Subject: [PATCH] Updated mkvmerge-add-subtitles to use named subtitle files. --- functions/mkvmerge-add-subtitles | 56 ++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/functions/mkvmerge-add-subtitles b/functions/mkvmerge-add-subtitles index 4eccc37..c6e83de 100644 --- a/functions/mkvmerge-add-subtitles +++ b/functions/mkvmerge-add-subtitles @@ -6,6 +6,11 @@ DEFAULT_LANGUAGE_CODE="eng" # TODO: This needs to be used in the glob, but I don't know how. VIDEO_EXTENSIONS="mkv,mp4,avi" +typeset -A LANGUAGE_NAMES +LANGUAGE_NAMES=( \ + 'english' 'en' \ + ) + _mkvmerge_add_subtitles_mkvmerge () { original_file="$1" results_directory="$2" @@ -26,6 +31,15 @@ _mkvmerge_add_subtitles_mkvmerge () { # TODO: Support the other patterns listed in the above comment. video_basename="$1" + # Include subtitles without language codes, assuming $DEFAULT_LANGUAGE_CODE is correct. + # For example: [basename].srt + uncoded_subtitle_name="${original_file:r}.srt" + if [[ -f "$uncoded_subtitle_name" ]]; then + subtitle_options_array+=("--language" "0:${DEFAULT_LANGUAGE_CODE}" "$uncoded_subtitle_name") + echo "Found uncoded subtitle file ${uncoded_subtitle_name}, assuming \ + ${DEFAULT_LANGUAGE_CODE}." + fi + # Include subtitles with language codes in their filenames. # For example [basename].[language code].srt coded_subtitle_files=(${original_file:r}.*.srt(N)) @@ -37,13 +51,41 @@ _mkvmerge_add_subtitles_mkvmerge () { done fi - # Include subtitles without language codes, assuming $DEFAULT_LANGUAGE_CODE is correct. - # For example: [basename].srt - uncoded_subtitle_name="${original_file:r}.srt" - if [[ -f "$uncoded_subtitle_name" ]]; then - subtitle_options_array+=("--language" "0:${DEFAULT_LANGUAGE_CODE}" "$uncoded_subtitle_name") - echo "Found uncoded subtitle file ${uncoded_subtitle_name}, assuming \ - ${DEFAULT_LANGUAGE_CODE}." + # Include subtitles in the Subs directory + named_subtitle_files=(${original_file:h}/Subs/*.srt) + if [[ ! -z $named_subtitle_files ]]; then + existing_language_codes=() + for fname in $named_subtitle_files; do + file_basename=${fname:t} + + # determine language code from filenames like 2_English.srt + # This character soup does three things + # * #[0-9]*_ removes the preceding track number, such as 2_ or 13_ + # * :r removes the file extension + # * :l makes it all lowercase + language_name="${${file_basename#[0-9]*_}:r:l}" + echo "Found subtitle file ${fname}." + + if [[ $LANGUAGE_NAMES[$language_name] ]]; then + language_code=$LANGUAGE_NAMES[$language_name] + echo "Checking if subtitle file ${fname} is usable." + + # TODO: This is absolutely an ugly way to do this, but this is what works. + if $(echo ${existing_language_codes} > grep ${language_code}); then + subtitle_options_array+=("--language" "0:${language_code}" "$fname") + existing_language_codes+=$language_code + echo "Found ${language_code} subtitles at ${fname}." + + else + echo "Duplicate subtitle files for ${language_code}." + exit 1 + fi + + else + echo "Unknown language name ${language_name}." + exit 1 + fi + done fi # Finally, actually mux all the subtitles in if there are any.