toMKV.sh 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #!/bin/bash
  2. # Command line
  3. inFile="${1}"
  4. outFile="${2}"
  5. if [ -z "${inFile}" ] || [ ! -e "${inFile}" ]; then
  6. echo "Usage: `basename "${0}"` input_file [output_file]" 1>&2
  7. exit 1
  8. fi
  9. # Grab some codec info
  10. INFO="`~/bin/video/movInfo.pl "${inFile}"`"
  11. VCODECS="`echo "${INFO}" | grep VIDEO_CODEC`"
  12. if [ -z "${VCODECS}" ]; then
  13. echo "`basename "${0}"`: Could not determine video codec" 1>&2
  14. exit 2
  15. fi
  16. # Exclude files with MPEG-1/2 streams
  17. if echo "${VCODECS}" | grep -q ffmpeg[12]; then
  18. echo "Usage: `basename "${0}"` input_file [output_file]" 1>&2
  19. exit 1
  20. fi
  21. # Construct the output file name
  22. if [ -z "${outFile}" ]; then
  23. outFile="`basename "${inFile}"`"
  24. outFile="`echo "${outFile}" | sed 's%\.[A-Za-z0-9]*$%%'`"
  25. outFile="`dirname "${inFile}"`/${outFile}"
  26. fi
  27. # Merge external subtitles, if they exist
  28. srtFile="`echo "${inFile}" | sed 's%\.[^\.]*$%%'`.srt"
  29. if [ ! -e "${srtFile}" ]; then
  30. srtFile="`echo "${inFile}" | sed 's%\.[^\.]*$%%'`.ssa"
  31. fi
  32. if [ ! -e "${srtFile}" ]; then
  33. srtFile=""
  34. fi
  35. # Convert to MKV
  36. # Hide some common AVI conversion warnings
  37. tmpFile="`mktemp -t toMKV`"
  38. outFile="${outFile}.mkv"
  39. if [ -n "${srtFile}" ]; then
  40. OUT="`mkvmerge --quiet -o "${tmpFile}" "${inFile}" "${srtFile}" 2>&1`"
  41. else
  42. OUT="`mkvmerge --quiet -o "${tmpFile}" "${inFile}" 2>&1`"
  43. fi
  44. echo "${OUT}" | grep -v "The AVC video track is missing the 'CTTS' atom for frame timecode offsets."
  45. # Check for errors
  46. if [ ! -e "${tmpFile}" ] || [ `stat -f '%z' "${tmpFile}"` -lt 1000 ]; then
  47. echo "`basename "${0}"`: Error creating output file for input: ${inFile}" 1>&2
  48. # Try to recode (with Handbrake/ffmpeg) if mkvmerge fails
  49. echo "`basename "${0}"`: Attempting recode instead..." 1>&2
  50. ~/bin/video/recode "${inFile}"
  51. exit "${?}"
  52. fi
  53. # Move into place, dropping the original
  54. tmpOut="`mktemp "${outFile}.XXXXXXXX"`"
  55. cp -X "${tmpFile}" "${tmpOut}" && rm "${inFile}" && mv "${tmpOut}" "${outFile}"
  56. rm -f "${tmpFile}" "${srtFile}"
  57. # Exit cleanly
  58. exit 0