0

我正在使用 taglib-ruby 来查看您每天可以听一首歌多少次。我让它适用于单首歌曲,但现在我正在尝试修复它,以便它可以遍历目录并吐出每首歌曲的长度以及每天可以收听多少次。它运行时不会抛出错误,但也不会输出任何内容。我不认为它出于某种原因看到这些文件。我尝试使用 foreach 并不断收到错误消息:

$ 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

所以我尝试切换到 glob:

#!/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

同意这个吗?对不起,我是一个菜鸟菜鸟。

4

2 回答 2

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
于 2015-02-14T00:01:23.437 回答
-1

夫妇的事情。

1) Dir.glob 想要一个类似于 shell 上使用的 glob 字符串。类似Dir.glob("*.mp3")或用于 subdirs 的东西Dir.glob("**/*.mp3")

2)在上一个示例中,您实际上并没有调用循环。循环遍历数组时(您正在这样做),您需要使用“每个”方法。

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

否则,您将块(do 和 end 之间的代码)传递给方法,而不是循环方法each

查看:http ://ruby-doc.org//core-2.2.0/Array.html ,了解可以应用于数组的各个方法。

于 2015-02-13T18:57:01.240 回答