zefie icon

cdrec

zefie | PRO | 12/26/19 06:31:28 AM UTC | 0 ⭐ | 822 👁️ | Never ⏰ | []
Bash |

2.3 KB

|

None

|

0 👍

/

0 👎

#!/bin/bash
# script to help recover/backup optical media
# -a for audio cd
 
# requires ddrescue (sometimes packaged as gddrescue) and cdparanoia
 
# usage: cdrec -f mydisc
# creates directory named mydisc and starts recovery into it
 
Z_APP=$(echo "${0}" | rev | cut -d'/' -f1 | rev | cut -d'.' -f1)
Z_APPPATH=$(dirname "$(realpath "${0}")")
source "${Z_APPPATH}/ansihelper.sh" # https://pastebin.com/M44TmzAE
 
function appmsg() {
    echo "$(str_color green '[')$(str_color cyan "${Z_APP}")$(str_color green ']') ${@}"
}
 
function cleanup() {
    if [ ! -z "${Z_TEMPDIR}" ]; then
        appmsg "Removing previously created temporary project directory \"${Z_PROJECT}\""
        rmdir "${Z_PROJECT_DIR}" 2>/dev/null
    fi
}
function apperr() {
    local exitcode=${1};
    shift;
    appmsg "$(str_color lred '[')$(str_color red ERROR )$(str_color lred ']') ${@}"
    cleanup
    exit ${exitcode};
}
 
 
while getopts "abf:" opts; do
    case "${opts}" in
        a)
            Z_AUDIO=1;
            shift;
            ;;
        b)
            Z_BROWSE=1;
            shift;
            ;;
        f)
            Z_PROJECT=${OPTARG};
            shift 2;
            ;;
    esac
done
 
if [ -z "${Z_PROJECT}" ] && [ -z "${Z_BROWSE}" ]; then
    apperr 1 "Usage: ${Z_APP} [-a] [-b] -f projectname"
fi
 
if [ -z "${Z_PROJECT}" ] && [ ! -z "${Z_BROWSE}" ]; then
    Z_TEMPDIR=1
    Z_PROJECT=zdisc
    appmsg "Using temporary project directory \"${Z_PROJECT}\""
fi
 
Z_PROJECT_DIR="$(realpath "$(dirname "${0}")")/${Z_PROJECT}"
 
if [ ! -d "${Z_PROJECT_DIR}" ]; then
    appmsg "Creating ${Z_PROJECT_DIR}"
    mkdir "${Z_PROJECT_DIR}"
fi
 
if [ "${Z_AUDIO}" ]; then
    CMD=(cdparanoia -z -B --)
elif [ "${Z_BROWSE}" ]; then
    Z_NOCD=1
    CMDS=3
    CMD1=(sudo mount /dev/sr0 "${Z_PROJECT_DIR}")
    CMD2=(mc "${Z_PROJECT_DIR}")
    CMD3=(sudo umount "${Z_PROJECT_DIR}")
else
    CMD=(ddrescue -d --sector-size=2048 --retry-passes=-1 "${@}" /dev/sr0 "${Z_PROJECT}.iso" "${Z_PROJECT}.map")
fi
if [ -z "${Z_NOCD}" ]; then
    appmsg "Entering ${Z_PROJECT_DIR}"
    cd "${Z_PROJECT_DIR}"
fi
 
if [ ! -z "${CMDS}" ]; then
    for n in $(seq 1 "${CMDS}"); do
        Z_CMD=($(eval 'echo ${CMD'$n'[@]}'))
        appmsg "Executing command ${n} of ${CMDS}: ${Z_CMD[@]}"
        "${Z_CMD[@]}"
        Z_EC=$?
        if [ ${Z_EC} -ne 0 ]; then
            apperr ${Z_EC} "Command failed with error code ${Z_EC}"
        fi
    done
else
    appmsg "Executing command: ${CMD[@]}"
    "${CMD[@]}"
    Z_EC=$?
fi
cleanup

Comments