Раздел «Язык Ruby».RubySchoolSourceL02:
<<Программирование на Ruby

Занятие 2: Построение дерева содержания директории. Анализ музыкальной коллекции с помощью id3lib

Следующее занятие
Предыдущее занятие

Вывод дерева файлов

# вывести дерево файлов
def print_tree(dir, level = 0)
  return unless File.directory?(dir)
  
  Dir.open(dir).each do |entry|
    next if entry =~ /^\./
    file_name = File.join(dir, entry)
    puts "  " * level + entry
    if File.directory?(file_name)
      print_tree(file_name, level + 1)
    end
  end
end

dir = '/home/artem/Музыка'

print_tree(dir)

Установка библиотек id3

# apt-get install id3lib
# gem install id3lib-ruby

Итоговый вариант - просмотр музыкальной коллекции

require 'rubygems'
require 'id3lib'
require 'yaml'

#GENRES_NAMES =  IO.read('genres.txt').split("\n").inject({}) {|h,line|
#  g_id,g_name = line.split(" - ")
#  h[g_id] = g_name
#  h
#}
# File.open("genres.yml", 'w') {|f| f.write(GENRES_NAMES.to_yaml)}

GENRES_NAMES = YAML.load_file('genres.yml')

$genres_freqs = Hash.new(0)

def print_tree(dir, level = 0)
  return unless File.directory?(dir)
  
  Dir.open(dir).each do |entry|
    next if entry =~ /^\./
    file_name = File.join(dir, entry)
    if file_name =~ /mp3$/
      begin
        tag = ID3Lib::Tag.new(file_name)
        genre = tag.genre
        (genre =~ /\((\d+)\)/) and (genre = $1)
        genre = GENRES_NAMES[genre] if GENRES_NAMES.has_key?(genre)
        entry << " genre #{genre}"
        $genres_freqs[genre] += 1
        if genre == 'Soundrack' # исправляем ошибочный жанр
          tag.genre = "Soundtrack"
          tag.update!
        end
      rescue Exception => e
        STDERR.puts "Не могу извлечь id3tag из #{file_name}: #{e.to_s}"
      end
    end
    puts "  " * level + entry
    if File.directory?(file_name)
      print_tree(file_name, level + 1)
    end
  end
end

dir = '/home/artem/Музыка'

print_tree(dir)

$genres_freqs.to_a.sort_by{|genre,n| -n}.each do |genre,n|
  puts "#{genre}: #{n}"
end

Пример работы с YAML

a = [
 {1=>'a', 2 => {3 => 'b', 4 => 'y'}}, 
 Time.now, 
 1.2323
]

File.open("x.yml", 'w'){|f| f.write(YAML.dump(a))}

g = YAML.load(str)

puts g.inspect

puts g[-2].class

Следующее занятие
Предыдущее занятие

Attachment sort Action Size Date down Who Comment
genres.txt manage 2.1 K 20 Nov 2010 - 13:40 ArtemVoroztsov  
genres.yml manage 2.2 K 20 Nov 2010 - 18:16 ArtemVoroztsov