jeudi, décembre 21, 2006

Renommer ses divx en ruby

On m'a mis au défit de faire un script pour renommer un ensemble de divx dont le nom de fichier ressemble à [qqchose]01[autrechose]02[encore_qqchose].[une_extension]:
require 'ftools'
require 'fileutils'

from_directory = "divx"
to_directory = "divx_renamed"
extentions = %w{.srt .avi .mov .wmv}
prefix = "lost"
pattern = /[0-9]{2}/

Dir.mkdir(to_directory) unless File.exist?(to_directory)

Dir.foreach(from_directory) do |filename|
  fullpath = from_directory + '/' + filename
  file_ext = File.extname(fullpath)
  if (File.file?(fullpath) && extentions.include?(file_ext))
    puts "Changing: " + filename + "..."
    # *[0-9]{2}*[0-9]{2}.ext
    basename =  File.basename(fullpath, file_ext)
    basename =~ pattern
    season = $&
    # match against the rest of the basename
    $' =~ pattern
    episode = $&
    new_basename = prefix + "-s" + season + "-e" + episode
    puts new_basename
    File.copy fullpath, to_directory + '/' + new_basename + file_ext
  end
end
Si vous avez des idées pour le rendre plus court (mais toujours lisible)... les commentaires sont les bienvenus ;)
Technorati tags:

Un moteur de templates en 5 min!

Problème: J'avais besoin de faire n fichiers dont le nom changeait à chaque fois en fonction d'une variable, la même variable était réutilisé dans mon fichier.
Solution:
  • Copier/coller pendant 10 min (argh...)
  • Utiliser un éditeur (vim, emacs, ultraedit etc..)
  • Un petit script ruby
Typiquement c'est un cas d'utilisation d'un template. En java j'aurait du créer un projet, choisir entre Velocity, FreeMarker, ajouter la lib etc... trop long! Le copier/coller était plus rapide.
Mais en ruby, 1 fichier ruby et une petite astuce que m'a passé edlapoignée ;), il m'a fallu 5 min chrono! J'adore Ruby!
Créer 4 fichiers (recette-tomate.xml, recette-carotte.xml, recette-navet.xml, recette-laitue.xml) avec le nom du légume qui change à l'intérieur du fichier:
# beaucoup plus de valeurs dans la realite...
legumes = ["tomate","carotte","navet","laitue"]

legumes.each do |legume|
  File.open("recette-#{legume}.xml", File::CREAT|File::RDWR|File::TRUNC) do |file| 
    content = <<EOF
<?xml version="1.0"?>

<recettes>
    <recette>
        <ingredient>#{legume}</ingredient>
    </recette>
</recettes>
EOF

file << content
  end
end
Technorati tags: