<<Программирование на Ruby
Занятие 2: Построение дерева содержания директории. Анализ музыкальной коллекции с помощью id3lib
- Прошло:
- суббота, 2010.11.27, 15:00
Вывод дерева файлов
# вывести дерево файлов
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