2015-02-13 6 views
0

Я использую taglib-ruby, чтобы узнать, сколько раз вы можете слушать песню в день. Я получил его, чтобы работать на отдельные песни, но теперь я пытаюсь исправить это, чтобы он мог прокручивать каталог и выплюнуть, сколько времени каждая песня и сколько раз в день вы можете ее слушать. Он не выдает ошибки при запуске, но также ничего не выводит. Я не думаю, что он видел файлы по какой-то причине. Я пытался использовать Еогеасп и продолжал получать сообщение об ошибке сказав это:Невозможно получить Ruby foreach или glob для работы с ARGV ... или вообще

$ ruby songtime.rb /media/ab/storage/Music/Between\ the\ Buried\ and\ Me/[2007]\ Colors/ 
songtime.rb:9:in `block (2 levels) in <main>': undefined method `length' for nil:NilClass (NoMethodError) 
     from /home/ab/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/taglib-ruby-0.7.0/lib/taglib/base.rb:8:in `open' 
     from songtime.rb:7:in `block in <main>' 
     from songtime.rb:4:in `foreach' 
     from songtime.rb:4:in `<main>' 

же проблема возникнет, если я просто жёстко имя каталога в программе, которая была что-то вроде:

#!/usr/bin/ruby 
require "taglib" 

Dir.foreach(ARGV[0]) do |songfile| 

    next if songfile == '.' or songfile == '..' 
    TagLib::FileRef.open(songfile) do |mp3| 
    properties = mp3.audio_properties 
    songLength = properties.length 
    puts "Song length is #{songLength}" 
    puts "You can listen to this song #{(24*60*60/songLength * 1000).floor/1000.0} times per day." 
    end 

end 

Так что я попытался переключение на глобус:

#!/usr/bin/ruby 
require "taglib" 

Dir.glob("#{ARGV[0]}*.mp3") do |songfile| 

    TagLib::FileRef.open(songfile) do |mp3| 
    properties = mp3.audio_properties 
    songLength = properties.length 
    puts "Song length is #{songLength}" 
    puts "You can listen to this song #{(24*60*60/songLength * 1000).floor/1000.0} times per day." 
    end 

end 

Что не работает. Сообщения об ошибках отсутствуют, но ничего не печатается. Он также не работает, если я положил

#!/usr/bin/ruby 
require "taglib" 

Dir.glob("/media/ab/storage/Music/Between the Buried and Me/[2007] Colors/*.mp3") do |songfile| 

    TagLib::FileRef.open(songfile) do |mp3| 
    properties = mp3.audio_properties 
    songLength = properties.length 
    puts "Song length is #{songLength}" 
    puts "You can listen to this song #{24*60*60/songLength} times per day." 
    end 

end 

Суп с этим? Извините за ноу-хау.

ответ

0

Dir автоматически начнет с пути, где находится сама программа ... поэтому, когда я сделал/media/ab ... и т. Д., Он фактически выполнял Code/Ruby/ab/media и т. Д. (Который не существует).

Я изменил программу и вот рабочая версия.

#!/usr/bin/ruby 
require "taglib" 
Dir.chdir(ARGV[0]) 
Dir.foreach(Dir.pwd) do |songfile| 

    next if songfile == '.' or songfile == '..' or songfile !~ /[\s\S]*.mp3/ 
    puts songfile 
    TagLib::FileRef.open(songfile) do |mp3| 
    properties = mp3.audio_properties 
    songLength = properties.length 
    puts "Song length is #{songLength}" 
    puts "You can listen to this song #{24*60*60/songLength} times per day." 
    puts "" 
    end 

end 
-1

Пара вещей.

1) Dir.glob хочет строку глобуса, подобную той, что используется на оболочке. что-то вроде Dir.glob("*.mp3") или для поддиректоров Dir.glob("**/*.mp3").

2) вы фактически не вызываете цикл в своем последнем примере. При переходе через массив (который вы делаете) вам нужно использовать метод «каждый».

Dir.glob("*.mp3").each do |filename| 
... 
end 

В противном случае, вы передаете блок (код между делами и в конце) к методу, а не к методам цикла each.

Оформить заявку: http://ruby-doc.org//core-2.2.0/Array.html для отдельных методов, которые вы можете применить к массиву.

+0

1) И он делает это 2) Он не перебирает массив, [проверьте документацию по методу '.glob'] (http://ruby-doc.org//core-2.2.0/ Dir.html # способ-с-Глоб). '.glob' с блоком используется для обработки результатов, вам не нужно' .each' там –

+0

ahh, справа. Я забыл, что вы можете использовать его таким образом, хороший звонок. – Kwanasolis