MC burner
Laszlo Monda
mondalaci at freemail.hu
Fri Jan 31 02:28:01 UTC 2003
Hi,
I've written a CD burner menu extension for MC. It consists of the menu file (of course) and a bash script sourced from the menu. I know it's quite simple and not well integrated into MC, but it works well and it's (more or less) feature full.
You can burn single session/multi session CDs in dummy mode or on-the-fly. Additionally you can blank CDs (that wasn't really hard to implement ;)
This stuff supposes that you have a correct cdrecord config (correctly set up cdrecord.conf with default scsi device and speed (/etc/default/cdrecord.conf in debian))
I know you rejected a cd burner patch from someone else some time ago. The reason was that we should wait for some API change to implement the extension as a plugin. I think it's really time to provide a way to burn CDs from MC. This solution doesn't require any modification in the MC code and may be good until that API change.
I have written dozens of CDs well with this tiny piece of code but there's one known bug: when I want to burn another session sometimes the content of the disk is the same as before the burn.
I've both attached the files and included them for easier discussion. I am interested in your opinion.
The last entry of the menu doesn't belong to cd burning but it was extremly useful for me.
I'm subscribed so you don't need to CC: me.
---------------------------- menu -----------------------------------
shell_patterns=0
a tagged files->image->burn [dummy][multi]
. mc-burner
read_mod
create_path_list %u
create_image
read -p "please insert the CD-R into your recorder and press ENTER to burn!"
$cdrecord $dummy $multi $iso && rm $iso || echo "You may use the image file \`$iso' for further burning"
b tagged files->burn (on-the-fly) [dummy][multi]
. mc-burner
read_mod
create_path_list %u
read -p "please insert the CD-R into your recorder and press ENTER to burn!"
$mkisofs | $cdrecord $dummy $multi -
rm $pathlist
c image (selected)->burn [dummy][multi]
. mc-burner
read_mod
$cdrecord $dummy $multi "%s"
d blank CD
. mc-burner
$cdrecord blank=all
r make a release
read -p 'release number: ' release
mv %s %s-$release
tar -cvvf %s-$release.tar --exclude=CVS %s-$release
mv %s-$release %s
bzip2 -9 %s-$release.tar
-------------------------- mc-burner --------------------------------
#!/bin/sh
CD_74_SECT=337350
CD_80_SECT=359849
tmp=${MC_BURNER_TMP-/tmp}
mkisofs_base=${MC_BURNER_MKISOFS-"mkisofs -R -J -dir-mode 555"}
cdrecord=${MC_BURNER_CDRECORD-"cdrecord -data -v -eject $dummy $multi"}
tmpfileprefix=$tmp/mc-burner.`date +%Y-%m-%d_%H.%M.%S`
pathlist=$tmpfileprefix.pathlist
iso=$tmpfileprefix.iso
mkisofs="$mkisofs_base -graft-points -path-list $pathlist"
trap "rm -f $pathlist $iso" SIGINT
function read_mod()
{
read -p "type \`d' for dummy, \`m' for multi burn or \`df' for both: " mod
if [ "$mod" == "d" ]; then
dummy="-dummy"
elif [ "$mod" == "m" ]; then
multi="-multi"
elif [ "$mod" == "dm" -o "$mod" == "md" ]; then
dummy="-dummy"
multi="-multi"
fi
}
function is_fit()
{
if (($1<=$2)); then
echo -n FIT
else
echo -n NOT FIT
fi
}
function create_path_list()
{
echo -n Creating path list...
exec 6>&1 1>$pathlist
while [ "$1" ]; do
s=`echo $1 | sed -e 's/=/\\\\=/g'`
if [ -d "$1" ]
then echo $s/=$s
else echo $s
fi
shift
done
exec 1>&6 6>&-
echo OK
}
function create_image()
{
if [ ! -d "$tmp" -a ! -w "$tmp" ]; then
echo Temporary directory \`$tmp\' does not exist or not writable or not a real directory! >&2
echo You may set MC_BURNER_TMP to a correct directory! >&2
exit 1
fi
msinfo=`cdrecord -msinfo`
if [ $msinfo ]; then
size=`echo $msinfo|awk -F , '{print $2}'`
((CD_74_SECT-=size))
((CD_80_SECT-=size))
msinfo="-M 0,0,0 -C $msinfo"
fi
echo computing occupied space:
image_size=`$mkisofs -print-size 2>/dev/null`
df_out=`df $tmp --block-size=2048 | grep '^/dev/'`
free_space=`echo $df_out | awk '{print $4}'`
free_drive=`echo $df_out | awk '{print $1}'`
if [ $((image_size>CD_80_SECT)) = 1 ]; then
echo Your image is too large \($((image_size/500))MB\) thus it wouldn\'t even fit on a 700MB CD, aborting. >&2
rm $pathlist
exit 1
fi
echo " image of CD64: $((2*image_size))K of $((2*CD_74_SECT))K ($((100*image_size/CD_74_SECT)).$((1000*image_size/CD_74_SECT%10))%) `is_fit $image_size $CD_74_SECT`"
echo " image of CD70: $((2*image_size))K of $((2*CD_80_SECT))K ($((100*image_size/CD_80_SECT)).$((1000*image_size/CD_80_SECT%10))%) `is_fit $image_size $CD_80_SECT`"
echo " image of $free_drive: $((2*image_size))K of $((2*free_space))K ($((100*image_size/free_space)).$((1000*image_size/free_space%10))%) `is_fit $image_size $free_space`"
if [ $((free_space<image_size)) = 1 ]; then
echo "You may set MC_BURNER_TMP to an appropriate path."
rm $pathlist
exit 1
fi
echo creating image:
if $mkisofs $* $msinfo -o $iso 2>&1 | grep -v '^Using.*'; then
rm $pathlist
else
echo Image creation failed! >&2
echo "You can find the path file for further image creation: \`$pathlist'." >&2
exit 4
fi
}
-----------------------------------------------------------------------------
thanks,
Laci
-------------- next part --------------
shell_patterns=0
a tagged files->image->burn [dummy][multi]
. mc-burner
read_mod
create_path_list %u
create_image
read -p "please insert the CD-R into your recorder and press ENTER to burn!"
$cdrecord $dummy $multi $iso && rm $iso || echo "You may use the image file \`$iso' for further burning"
b tagged files->burn (on-the-fly) [dummy][multi]
. mc-burner
read_mod
create_path_list %u
read -p "please insert the CD-R into your recorder and press ENTER to burn!"
$mkisofs | $cdrecord $dummy $multi -
rm $pathlist
c image (selected)->burn [dummy][multi]
. mc-burner
read_mod
$cdrecord $dummy $multi "%s"
d blank CD
. mc-burner
$cdrecord blank=all
r make a release
read -p 'release number: ' release
mv %s %s-$release
tar -cvvf %s-$release.tar --exclude=CVS %s-$release
mv %s-$release %s
bzip2 -9 %s-$release.tar
-------------- next part --------------
#!/bin/sh
CD_74_SECT=337350
CD_80_SECT=359849
tmp=${MC_BURNER_TMP-/tmp}
mkisofs_base=${MC_BURNER_MKISOFS-"mkisofs -R -J -dir-mode 555"}
cdrecord=${MC_BURNER_CDRECORD-"cdrecord -data -v -eject $dummy $multi"}
tmpfileprefix=$tmp/mc-burner.`date +%Y-%m-%d_%H.%M.%S`
pathlist=$tmpfileprefix.pathlist
iso=$tmpfileprefix.iso
mkisofs="$mkisofs_base -graft-points -path-list $pathlist"
trap "rm -f $pathlist $iso" SIGINT
function read_mod()
{
read -p "type \`d' for dummy, \`m' for multi burn or \`df' for both: " mod
if [ "$mod" == "d" ]; then
dummy="-dummy"
elif [ "$mod" == "m" ]; then
multi="-multi"
elif [ "$mod" == "dm" -o "$mod" == "md" ]; then
dummy="-dummy"
multi="-multi"
fi
}
function is_fit()
{
if (($1<=$2)); then
echo -n FIT
else
echo -n NOT FIT
fi
}
function create_path_list()
{
echo -n Creating path list...
exec 6>&1 1>$pathlist
while [ "$1" ]; do
s=`echo $1 | sed -e 's/=/\\\\=/g'`
if [ -d "$1" ]
then echo $s/=$s
else echo $s
fi
shift
done
exec 1>&6 6>&-
echo OK
}
function create_image()
{
if [ ! -d "$tmp" -a ! -w "$tmp" ]; then
echo Temporary directory \`$tmp\' does not exist or not writable or not a real directory! >&2
echo You may set MC_BURNER_TMP to a correct directory! >&2
exit 1
fi
msinfo=`cdrecord -msinfo`
if [ $msinfo ]; then
size=`echo $msinfo|awk -F , '{print $2}'`
((CD_74_SECT-=size))
((CD_80_SECT-=size))
msinfo="-M 0,0,0 -C $msinfo"
fi
echo computing occupied space:
image_size=`$mkisofs -print-size 2>/dev/null`
df_out=`df $tmp --block-size=2048 | grep '^/dev/'`
free_space=`echo $df_out | awk '{print $4}'`
free_drive=`echo $df_out | awk '{print $1}'`
if [ $((image_size>CD_80_SECT)) = 1 ]; then
echo Your image is too large \($((image_size/500))MB\) thus it wouldn\'t even fit on a 700MB CD, aborting. >&2
rm $pathlist
exit 1
fi
echo " image of CD64: $((2*image_size))K of $((2*CD_74_SECT))K ($((100*image_size/CD_74_SECT)).$((1000*image_size/CD_74_SECT%10))%) `is_fit $image_size $CD_74_SECT`"
echo " image of CD70: $((2*image_size))K of $((2*CD_80_SECT))K ($((100*image_size/CD_80_SECT)).$((1000*image_size/CD_80_SECT%10))%) `is_fit $image_size $CD_80_SECT`"
echo " image of $free_drive: $((2*image_size))K of $((2*free_space))K ($((100*image_size/free_space)).$((1000*image_size/free_space%10))%) `is_fit $image_size $free_space`"
if [ $((free_space<image_size)) = 1 ]; then
echo "You may set MC_BURNER_TMP to an appropriate path."
rm $pathlist
exit 1
fi
echo creating image:
if $mkisofs $* $msinfo -o $iso 2>&1 | grep -v '^Using.*'; then
rm $pathlist
else
echo Image creation failed! >&2
echo "You can find the path file for further image creation: \`$pathlist'." >&2
exit 4
fi
}
More information about the mc-devel
mailing list