Difference between revisions of "Rip Audio CDs"

From ArchWiki
Jump to: navigation, search
m (Shell script)
m (Using a simple shell script: used nowiki instead of html codes)
(5 intermediate revisions by 4 users not shown)
Line 1: Line 1:
[[Category:Optical (English)]]
+
[[Category:Optical]]
{{i18n|Rip Audio CDs}}
+
CD rippers are designed to extract ("rip") the raw digital audio (in a format commonly called CDDA) from a compact disc to a file or other output. Most CD rippers also support burning audio to a CD and transcoding it on-the-fly.
==Graphical tools==
+
There are several tools to create .mp3 or .ogg files from an audio CD (eg. k3b, KAudioCreator, Rhythmbox)
+
  
==Console tools==
+
== Introduction ==
abcde is a comprehensive audio ripping tool, including CDDB lookup.
+
Music is usually stored on audio CDs in an uncompressed format (requires a lot of space, e.g. 700MB for only 80 minutes of audio). Extracting the audio from the CD usually involves compressing it so that it requires less space using:
 +
; Lossless compression: same quality, less space.
 +
; Lossy compression: lower quality, much less space.
  
==Shell script==
+
Most common formats to convert to are: APE and FLAC for lossless and MP3 and OGG for lossy.
If you want to rip an audio CD gapless and using CD-Text you can use the following shell script. You need to have the following packages installed on your system: ''mp3splt'', ''cdrtools'' and ''vorbis-tools''.
+
  
You need cdrtools from AUR for this script to work: [https://aur.archlinux.org/packages.php?ID=323 cdrtools]
+
== Ripping ==
 +
=== Using a CD ripper ===
 +
{{Box||For some examples of CD rippers see: [[Common Applications#CD Ripping]].|#E5E5FF|#FCFCFC}}
  
{{hc|rip_gapless.sh|
+
=== Using a simple shell script ===
 +
If you want to rip an audio CD gapless and using CD-Text you can use the following shell script. You need to [[Pacman|install]] the {{Pkg|mp3splt}}, {{Pkg|cdrtools}} and {{Pkg|vorbis-tools}} packages, all available in the [[official repositories]].
 +
 
 +
{{hc|rip_gapless.sh|<nowiki>
 
#!/bin/sh
 
#!/bin/sh
 
# This script needs mp3splt, cdrtools, vorbis-tools
 
# This script needs mp3splt, cdrtools, vorbis-tools
  
CREATE_OGG&#61;"true";
+
CREATE_OGG="true";
CREATE_FLAC&#61;"false";
+
CREATE_FLAC="false";
CREATE_MKA&#61;"false";
+
CREATE_MKA="false";
  
WORKING_DIRECTORY&#61;`pwd`
+
WORKING_DIRECTORY=`pwd`
  
 
function usage()  
 
function usage()  
 
{  
 
{  
   echo "Usage: $0 &#91;OUTPUT_DIRECTORY&#93; device";
+
   echo "Usage: $0 [OUTPUT_DIRECTORY] device";
 
   echo "eg.: $0 my_audio_cd /dev/sr0";
 
   echo "eg.: $0 my_audio_cd /dev/sr0";
 
   exit;
 
   exit;
&#125;
+
}
  
 
function no_cdtext()
 
function no_cdtext()
Line 35: Line 39:
 
   echo "$0 OUTPUT_DIRECTORY device";
 
   echo "$0 OUTPUT_DIRECTORY device";
 
   exit;
 
   exit;
&#125;
+
}
  
 
function remove_quotes() {
 
function remove_quotes() {
 
   local OUTPUT_STRING
 
   local OUTPUT_STRING
 
   # remove quotes
 
   # remove quotes
   OUTPUT_STRING&#61;$(echo "$1" &#124; sed "s/^\(&#91;\"'&#93;\)\(.*\)\1\$/\2/g")
+
   OUTPUT_STRING=$(echo "$1" | sed "s/^\([\"']\)\(.*\)\1\$/\2/g")
 
   # remove selected special characters
 
   # remove selected special characters
   echo "$OUTPUT_STRING" &#124; sed "s/\(.*\)&#91;\\&#93;\(.*\)/\1\2/g"
+
   echo "$OUTPUT_STRING" | sed "s/\(.*\)[\\]\(.*\)/\1\2/g"
&#125;
+
}
  
  
 
# store command line parameters
 
# store command line parameters
if  &#91;&#91; "$#" &#61; "2" &#93;&#93; ; then
+
if  [[ "$#" = "2" ]] ; then
   CDROM&#61;$2;
+
   CDROM=$2;
   OUTPUT_DIRECTORY&#61;$1;
+
   OUTPUT_DIRECTORY=$1;
elif &#91;&#91; "$#" &#61; "1" &#93;&#93; ; then
+
elif [[ "$#" = "1" ]] ; then
   CDROM&#61;$1;
+
   CDROM=$1;
 
else  
 
else  
 
   usage;
 
   usage;
Line 58: Line 62:
 
# retrieve CD information
 
# retrieve CD information
 
echo "Retrieve CD information"
 
echo "Retrieve CD information"
# CD_INFO&#61;$(cdda2wav -J -g /dev/sr0 2>&1)
+
CD_INFO=$(cdda2wav -J -g /dev/sr0 2>&1)
  
 
# test if CD-Text is available
 
# test if CD-Text is available
if &#91;&#91; "detected" &#61;&#61; $(echo "${CD_INFO&#125;" &#124; awk '/^CD-Text.*/ {print $2&#125;') &#93;&#93;; then
+
if [[ "detected" == $(echo "${CD_INFO}" | awk '/^CD-Text.*/ {print $2}') ]]; then
 
   echo "CD-Text detected"
 
   echo "CD-Text detected"
   CD_TEXT_DETECTED&#61;true
+
   CD_TEXT_DETECTED=true
   ALBUM_INFORMATION&#61;$(echo "${CD_INFO&#125;" &#124; grep ^"Album title")
+
   ALBUM_INFORMATION=$(echo "${CD_INFO}" | grep ^"Album title")
 
   # remove characters from beginning of string
 
   # remove characters from beginning of string
   ALBUM_INFORMATION&#61;$(echo "${ALBUM_INFORMATION#*Album title: &#125;")
+
   ALBUM_INFORMATION=$(echo "${ALBUM_INFORMATION#*Album title: }")
   ALBUM_TITLE&#61;$(echo "${ALBUM_INFORMATION% from *&#125;")
+
   ALBUM_TITLE=$(echo "${ALBUM_INFORMATION% from *}")
   ALBUM_TITLE&#61;$(remove_quotes "${ALBUM_TITLE&#125;")
+
   ALBUM_TITLE=$(remove_quotes "${ALBUM_TITLE}")
   ALBUM_ARTIST&#61;$(echo "${ALBUM_INFORMATION#* from &#125;")
+
   ALBUM_ARTIST=$(echo "${ALBUM_INFORMATION#* from }")
   ALBUM_ARTIST&#61;$(remove_quotes "${ALBUM_ARTIST&#125;")
+
   ALBUM_ARTIST=$(remove_quotes "${ALBUM_ARTIST}")
 
fi
 
fi
  
 
# check if cd has cdtext
 
# check if cd has cdtext
if &#91;&#91; true &#61;&#61; ${CD_TEXT_DETECTED&#125; &#93;&#93;; then
+
if [[ true == ${CD_TEXT_DETECTED} ]]; then
   if &#91;&#91; "2" &#61; "$#" &#93;&#93;; then
+
   if [[ "2" = "$#" ]]; then
 
     echo "CD-text found"
 
     echo "CD-text found"
 
     echo "Overriding given output directory name"
 
     echo "Overriding given output directory name"
 
   fi
 
   fi
   mkdir -p "./${ALBUM_ARTIST&#125;/${ALBUM_TITLE&#125;"
+
   mkdir -p "./${ALBUM_ARTIST}/${ALBUM_TITLE}"
   cd "./${ALBUM_ARTIST&#125;/${ALBUM_TITLE&#125;"
+
   cd "./${ALBUM_ARTIST}/${ALBUM_TITLE}"
   OUTPUT_DIRECTORY&#61;"${ALBUM_ARTIST&#125;/${ALBUM_TITLE&#125;"
+
   OUTPUT_DIRECTORY="${ALBUM_ARTIST}/${ALBUM_TITLE}"
   OUTPUT_FILENAME&#61;"${ALBUM_TITLE&#125;"
+
   OUTPUT_FILENAME="${ALBUM_TITLE}"
 
else
 
else
   if &#91;&#91; "$#" !&#61; "2" &#93;&#93;; then
+
   if [[ "$#" != "2" ]]; then
 
     no_cdtext
 
     no_cdtext
 
   else
 
   else
     mkdir "${OUTPUT_DIRECTORY&#125;"
+
     mkdir "${OUTPUT_DIRECTORY}"
     cd "${OUTPUT_DIRECTORY&#125;"
+
     cd "${OUTPUT_DIRECTORY}"
     OUTPUT_FILENAME&#61;"${OUTPUT_DIRECTORY&#125;"
+
     OUTPUT_FILENAME="${OUTPUT_DIRECTORY}"
 
   fi
 
   fi
 
fi
 
fi
  
# cdda2wav -cuefile -paranoia -t all dev&#61;${CDROM&#125; "${OUTPUT_FILENAME&#125;.wav" &> "${OUTPUT_FILENAME&#125;.log"
+
cdda2wav -cuefile -paranoia -t all dev=${CDROM} "${OUTPUT_FILENAME}.wav" &> "${OUTPUT_FILENAME}.log"
  
if &#91;&#91; "true" &#61; ${CREATE_OGG&#125; &#93;&#93;; then
+
if [[ "true" = ${CREATE_OGG} ]]; then
 
   mkdir ogg
 
   mkdir ogg
 
   pushd ogg
 
   pushd ogg
   oggenc -o "${OUTPUT_FILENAME&#125;.ogg" -q 6 "../${OUTPUT_FILENAME&#125;.wav"
+
   oggenc -o "${OUTPUT_FILENAME}.ogg" -q 6 "../${OUTPUT_FILENAME}.wav"
   oggsplt -c "../${OUTPUT_FILENAME&#125;.cue" -o "@N - @t" "${OUTPUT_FILENAME&#125;.ogg"
+
   oggsplt -c "../${OUTPUT_FILENAME}.cue" -o "@N - @t" "${OUTPUT_FILENAME}.ogg"
 
   popd
 
   popd
 
fi
 
fi
  
if &#91;&#91; "true" &#61; ${CREATE_FLAC&#125; &#93;&#93;; then
+
if [[ "true" = ${CREATE_FLAC} ]]; then
 
   mkdir flac
 
   mkdir flac
 
   pushd flac
 
   pushd flac
   cd flac  # -5 -V -T "ARTIST&#61;%a" -T "ALBUM&#61;%g" -T "DATE&#61;%y" -T "GENRE&#61;%m" --tag-from-file&#61;CUESHEET&#61;"%a - %g.cue" --cuesheet&#61;"%a - %g.cue" %s
+
   cd flac  # -5 -V -T "ARTIST=%a" -T "ALBUM=%g" -T "DATE=%y" -T "GENRE=%m" --tag-from-file=CUESHEET="%a - %g.cue" --cuesheet="%a - %g.cue" %s
   flac --cuesheet&#61;"../${OUTPUT_FILENAME&#125;.cue" --tag-from-file&#61;CUESHEET&#61;"../${OUTPUT_FILENAME&#125;.cue" --output-name&#61;"./${OUTPUT_FILENAME&#125;.flac" --best "../${OUTPUT_FILENAME&#125;.wav"
+
   flac --cuesheet="../${OUTPUT_FILENAME}.cue" --tag-from-file=CUESHEET="../${OUTPUT_FILENAME}.cue" --output-name="./${OUTPUT_FILENAME}.flac" --best "../${OUTPUT_FILENAME}.wav"
 
   popd
 
   popd
 
fi
 
fi
  
if &#91;&#91; "true" &#61; ${CREATE_MKA&#125; &#93;&#93;; then
+
if [[ "true" = ${CREATE_MKA} ]]; then
 
   mkdir mka
 
   mkdir mka
 
   pushd mka
 
   pushd mka
   # -5 -V -T "ARTIST&#61;%a" -T "ALBUM&#61;%g" -T "DATE&#61;%y" -T "GENRE&#61;%m" --tag-from-file&#61;CUESHEET&#61;"%a - %g.cue" --cuesheet&#61;"%a - %g.cue" %s
+
   # -5 -V -T "ARTIST=%a" -T "ALBUM=%g" -T "DATE=%y" -T "GENRE=%m" --tag-from-file=CUESHEET="%a - %g.cue" --cuesheet="%a - %g.cue" %s
   flac --output-name&#61;"./${OUTPUT_FILENAME&#125;.flac" --best "../${OUTPUT_FILENAME&#125;.wav"
+
   flac --output-name="./${OUTPUT_FILENAME}.flac" --best "../${OUTPUT_FILENAME}.wav"
   mkvmerge -q -o "${OUTPUT_FILENAME&#125;.flac.mka" "${OUTPUT_FILENAME&#125;.flac" --attachment-mime-type text/plain --attachment-description "cdda2wav Log" --attach-file "../${OUTPUT_FILENAME&#125;.log" --attachment-mime-type text/plain --attachment-description "Original CUE Sheet" --attach-file "../${OUTPUT_FILENAME&#125;.cue" --title "${ALBUM_TITLE&#125;" --chapters "../${OUTPUT_FILENAME&#125;.cue"
+
   mkvmerge -q -o "${OUTPUT_FILENAME}.flac.mka" "${OUTPUT_FILENAME}.flac" --attachment-mime-type text/plain --attachment-description "cdda2wav Log" --attach-file "../${OUTPUT_FILENAME}.log" --attachment-mime-type text/plain --attachment-description "Original CUE Sheet" --attach-file "../${OUTPUT_FILENAME}.cue" --title "${ALBUM_TITLE}" --chapters "../${OUTPUT_FILENAME}.cue"
   rm "./${OUTPUT_FILENAME&#125;.flac"
+
   rm "./${OUTPUT_FILENAME}.flac"
 
   popd
 
   popd
 
fi
 
fi
  
# rm "${WORKING_DIRECTORY&#125;/${OUTPUT_DIRECTORY&#125;/${OUTPUT_FILENAME&#125;.{cddb,cdindex,cdtext,wav&#125;"
+
# rm "${WORKING_DIRECTORY}/${OUTPUT_DIRECTORY}/${OUTPUT_FILENAME}.{cddb,cdindex,cdtext,wav}"
}}
+
</nowiki>}}
 +
 
 +
== Post-processing ==
 +
=== Tag Editors ===
 +
{{Box||For some examples of audio tag editors see: [[Common Applications#Audio tag editors]].|#E5E5FF|#FCFCFC}}
 +
=== Converting to other formats ===
 +
If the CD ripper you used does not support the format you wanted to convert to you can use other encoders/decoders such as [[FFmpeg]] or [[MEncoder]]. Some simple scripts to convert from [[Convert Flac to Mp3|flac]] or [[Convert Any To Mp3|other formats]] to mp3 can also be found on the wiki.

Revision as of 09:24, 31 August 2012

CD rippers are designed to extract ("rip") the raw digital audio (in a format commonly called CDDA) from a compact disc to a file or other output. Most CD rippers also support burning audio to a CD and transcoding it on-the-fly.

Introduction

Music is usually stored on audio CDs in an uncompressed format (requires a lot of space, e.g. 700MB for only 80 minutes of audio). Extracting the audio from the CD usually involves compressing it so that it requires less space using:

Lossless compression
same quality, less space.
Lossy compression
lower quality, much less space.

Most common formats to convert to are: APE and FLAC for lossless and MP3 and OGG for lossy.

Ripping

Using a CD ripper

Template:Box

Using a simple shell script

If you want to rip an audio CD gapless and using CD-Text you can use the following shell script. You need to install the mp3splt, cdrtools and vorbis-tools packages, all available in the official repositories.

rip_gapless.sh
#!/bin/sh
# This script needs mp3splt, cdrtools, vorbis-tools

CREATE_OGG="true";
CREATE_FLAC="false";
CREATE_MKA="false";

WORKING_DIRECTORY=`pwd`

function usage() 
{ 
  echo "Usage: $0 [OUTPUT_DIRECTORY] device";
  echo "eg.: $0 my_audio_cd /dev/sr0";
  exit;
}

function no_cdtext()
{
  echo "CD doesn't contain cd-text information";
  echo "Please specify output directory";
  echo "$0 OUTPUT_DIRECTORY device";
  exit;
}

function remove_quotes() {
  local OUTPUT_STRING
  # remove quotes
  OUTPUT_STRING=$(echo "$1" | sed "s/^\([\"']\)\(.*\)\1\$/\2/g")
  # remove selected special characters
  echo "$OUTPUT_STRING" | sed "s/\(.*\)[\\]\(.*\)/\1\2/g"
}


# store command line parameters
if  [[ "$#" = "2" ]] ; then
  CDROM=$2;
  OUTPUT_DIRECTORY=$1;
elif [[ "$#" = "1" ]] ; then
  CDROM=$1;
else 
  usage;
fi

# retrieve CD information
echo "Retrieve CD information"
CD_INFO=$(cdda2wav -J -g /dev/sr0 2>&1)

# test if CD-Text is available
if [[ "detected" == $(echo "${CD_INFO}" | awk '/^CD-Text.*/ {print $2}') ]]; then
  echo "CD-Text detected"
  CD_TEXT_DETECTED=true
  ALBUM_INFORMATION=$(echo "${CD_INFO}" | grep ^"Album title")
  # remove characters from beginning of string
  ALBUM_INFORMATION=$(echo "${ALBUM_INFORMATION#*Album title: }")
  ALBUM_TITLE=$(echo "${ALBUM_INFORMATION% from *}")
  ALBUM_TITLE=$(remove_quotes "${ALBUM_TITLE}")
  ALBUM_ARTIST=$(echo "${ALBUM_INFORMATION#* from }")
  ALBUM_ARTIST=$(remove_quotes "${ALBUM_ARTIST}")
fi

# check if cd has cdtext
if [[ true == ${CD_TEXT_DETECTED} ]]; then
  if [[ "2" = "$#" ]]; then
    echo "CD-text found"
    echo "Overriding given output directory name"
  fi
  mkdir -p "./${ALBUM_ARTIST}/${ALBUM_TITLE}"
  cd "./${ALBUM_ARTIST}/${ALBUM_TITLE}"
  OUTPUT_DIRECTORY="${ALBUM_ARTIST}/${ALBUM_TITLE}"
  OUTPUT_FILENAME="${ALBUM_TITLE}"
else
  if [[ "$#" != "2" ]]; then
    no_cdtext
  else
    mkdir "${OUTPUT_DIRECTORY}"
    cd "${OUTPUT_DIRECTORY}"
    OUTPUT_FILENAME="${OUTPUT_DIRECTORY}"
  fi
fi

cdda2wav -cuefile -paranoia -t all dev=${CDROM} "${OUTPUT_FILENAME}.wav" &> "${OUTPUT_FILENAME}.log"

if [[ "true" = ${CREATE_OGG} ]]; then
  mkdir ogg
  pushd ogg
  oggenc -o "${OUTPUT_FILENAME}.ogg" -q 6 "../${OUTPUT_FILENAME}.wav"
  oggsplt -c "../${OUTPUT_FILENAME}.cue" -o "@N - @t" "${OUTPUT_FILENAME}.ogg"
  popd
fi

if [[ "true" = ${CREATE_FLAC} ]]; then
  mkdir flac
  pushd flac
  cd flac  # -5 -V -T "ARTIST=%a" -T "ALBUM=%g" -T "DATE=%y" -T "GENRE=%m" --tag-from-file=CUESHEET="%a - %g.cue" --cuesheet="%a - %g.cue" %s
  flac --cuesheet="../${OUTPUT_FILENAME}.cue" --tag-from-file=CUESHEET="../${OUTPUT_FILENAME}.cue" --output-name="./${OUTPUT_FILENAME}.flac" --best "../${OUTPUT_FILENAME}.wav"
  popd
fi

if [[ "true" = ${CREATE_MKA} ]]; then
  mkdir mka
  pushd mka
  # -5 -V -T "ARTIST=%a" -T "ALBUM=%g" -T "DATE=%y" -T "GENRE=%m" --tag-from-file=CUESHEET="%a - %g.cue" --cuesheet="%a - %g.cue" %s
  flac --output-name="./${OUTPUT_FILENAME}.flac" --best "../${OUTPUT_FILENAME}.wav"
  mkvmerge -q -o "${OUTPUT_FILENAME}.flac.mka" "${OUTPUT_FILENAME}.flac" --attachment-mime-type text/plain --attachment-description "cdda2wav Log" --attach-file "../${OUTPUT_FILENAME}.log" --attachment-mime-type text/plain --attachment-description "Original CUE Sheet" --attach-file "../${OUTPUT_FILENAME}.cue" --title "${ALBUM_TITLE}" --chapters "../${OUTPUT_FILENAME}.cue"
  rm "./${OUTPUT_FILENAME}.flac"
  popd
fi

# rm "${WORKING_DIRECTORY}/${OUTPUT_DIRECTORY}/${OUTPUT_FILENAME}.{cddb,cdindex,cdtext,wav}"

Post-processing

Tag Editors

Template:Box

Converting to other formats

If the CD ripper you used does not support the format you wanted to convert to you can use other encoders/decoders such as FFmpeg or MEncoder. Some simple scripts to convert from flac or other formats to mp3 can also be found on the wiki.