ENCODER avec OGGENC et RUBY :

Le but de cette page est d'encoder automatiquement un disque et de tagger les fichiers ogg obtenus, en console sans passer par des applications graphiques telle que Grip. Il vous faudra pour cela : cdparanoia, oggenc, ruby et... un peu de bash...

Toutes les opérations seront réalisées dans le repertoire courant, avec les fichiers script et lst

D'abord rédiger un fichier texte 'lst'

Je préfère faire comme ça plutôt que d'utiliser les sources cddb pour un respect plus strict de la pochette du disque... Oui, je suis obsessionel...

artist: JOHANN HEINRICH SCHMELZER (ca.1620-1680)
album: Sonatae a violino solo
year: 2007
genre: Classical
#
01: Sonate en la mineur - (Preludio)
02: Sonate en la mineur - Aria
03: Sonate en la mineur - Variatio prima
04: Sonate en la mineur - Variatio seconda
05: Sonate en la mineur - Gigue
06: Ciaccona en la majeur
07: Sonate en si bémol majeur - Grave (e recitativo)
08: Sonate en si bémol majeur - Presto e adagio
09: Sonate en si bémol majeur - (Fantaisie sur une basse obstinée)
10: Sonate en si bémol majeur - Grave e Aria
11: Toccata Tertij Toni pour clavier seul # Wolfgang Ebner (1612-1665)
12: Sonata quarta en ré majeur - (Ciaccona)
13: Sonata quarta en ré majeur - (Variatio)
14: Sonata quarta en ré majeur - Sarabande
15: Sonata quarta en ré majeur - Gigue
16: Sonata quarta en ré majeur - Adagio a recitativo
17: Sonata quarta en ré majeur - Allegro
18: Gigue dite Pfefferstossl a violino solo senza basso
19: Sonatina en sol mineur
20: Allemande
21: Courante e variatio
22: Sarabande e variatio
23: Gigue
24: Sonata seconda pour théorbe seul - Grave, Allegro, Largo et Allegro

Le Script RUBY qui va appeler OGGENC :

Il suffit ensuite de lancer le script suivant par la commande ./script

Le script aura été rendu executable par : chmod u+x script

#!/usr/bin/env ruby
args = ARGV.reverse
paranoia = true
f_tags = "./lst"

# add here new tag type and their  oggenc option name if you need it
Authorized_tags = {
  "artist" => '-a',
  "album"  => '-l',
  "year"   => '-d',
  'genre'  => '-G',
}

def escape_shell str
  str.gsub!( /'/, "" )
  str.gsub!( /"/, '\\\"' )
  str
end

class Ripper
  attr_reader :titles, :tags

  def initialize f_tags, paranoia
    parse_tagfile f_tags
    paranoia ? ( puts "ripping" ; rip_wav ) : ( puts "skipping rip" )
  end

  def self.create f_tags, paranoia
    ( defined? @@created ) ? ( puts "another ripper running" ) : ( @@ripper = new f_tags, paranoia )
    @@created = true
    @@ripper
  end

  private
  def rip_wav
    puts "ripping..."
    %x(cdparanoia -B)
    File.delete("track00.cdda.wav") if File.exist?("track00.cdda.wav")
  end

  def parse_tagfile f_tags
    puts "parsing tagfile..."
    f        = File.open( f_tags )
    @titles  = []
    @tags    = {}

    lines = f.readlines

    lines.each { |line|
      next if line[/^ *#* *$/]
      line[/(\w+): ([^#]+)/]
      tag, data = $1, $2.chomp

      case tag
      when /\d+/ then titles[ tag.to_i ]   = data
      when /\w+/ then tags[ tag.downcase ] = data
      else
        puts "odd things in the tagfile. exiting.\n#{line}"
        exit 1
      end
    }
  end

  private_class_method :new
end

class Song
  @@threads   = 0
  @@termines  = 0

  def self.termines
    @@termines
  end

  def initialize file
    options = get_tags_string file
    sleep 1 while @@threads > 2
    @@threads += 1
    puts "beginning encoding of #{file}..."
    encode options
    puts "#{file} treatment finished"
    @@threads   -= 1
    @@termines  += 1 
  end

  def get_tags_string file
    num            = file[/\d+/]
    options_string = " -q6 -N '#{num}' "

    Authorized_tags.each { |key,value|
      tag             = $ripper.tags[ key ].dup || "unknown"
      tag = escape_shell tag
      options_string += "#{value} \"#{tag}\" "
    }

    title           = $ripper.titles[ num.to_i ].dup || "untitled"
    title = escape_shell title
    options_string += "-t \"#{title}\" "
    options_string += "#{file} -o '#{num}_#{title.gsub(/&|’|"| |\\/,'_').gsub(/_+/,'_').gsub(/^_|_$/,'')}.ogg' "

    return options_string
  end

  def encode options
    %x( oggenc #{options} 2> /dev/null )
  end
end

# parse arguments
while args != []
  argument = args[args.length - 1]
  case argument
    when "-x" then paranoia = false
    else File.exist?(argument) ? f_tags = argument : ( puts "file #{argument} does not exist" ; exit )
  end
  args.pop
end

$ripper = Ripper.create f_tags, paranoia
tracks = Dir.glob( 'track*' )

tracks.each { |file| 
  Thread.new { 
    Song.new file
    File.delete file
  } 
}

while Song.termines < tracks.length
  sleep 1
end

Si on a déjà lancé cdparanoia au prélable... alors on peut se contenter de lancer le script par ./script -x

Le script se chargera en toute fin de supprimer les .wav et le script

Après, je termine avec easytag pour créer une playlist de lecture .m3u

Un grand merci à KIK pour son aide !
(bon OK, c'est lui qui m'a tout fait... avec un petit grain de sable signé Christophe ^^)