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 ^^)