使用 ruby​​ mp3info 从外部站点读取 mp3 ID3(不加载整个文件)

Posted

技术标签:

【中文标题】使用 ruby​​ mp3info 从外部站点读取 mp3 ID3(不加载整个文件)【英文标题】:Use ruby mp3info to read mp3 ID3 from external site (without loading whole file) 【发布时间】:2012-03-16 12:04:20 【问题描述】:

我有一个服务器上的文件列表,我想只加载和解析每个文件中的 ID3。

下面的代码会加载整个文件,这在批处理时(显然)非常耗时。

require 'mp3info'
require 'open-uri'

uri = "http://blah.com/blah.mp3"

Mp3Info.open(open(uri)) do |mp3|
    puts mp3.tag.title   
    puts mp3.tag.artist   
    puts mp3.tag.album
    puts mp3.tag.tracknum
end

【问题讨论】:

这应该是可能的。查看这个合并的拉取请求。 啊,抱歉,链接丢失了。这个:github.com/moumar/ruby-mp3info/pull/5 啊,很好,这样就可以了。但我不知道 StringIO 语法是什么样子的 好吧,做一些研究,然后回来发布解决方案:) 【参考方案1】:

这个解决方案适用于 id3v2(当前标准)。 ID3V1 在文件开头没有元数据,因此在这些情况下它不起作用。

这会读取文件的前 4096 个字节,这是任意的。据我从ID3 documentation 得知,大小没有限制,但 4kb 是我的库中停止出现解析错误的时候。

我能够构建一个简单的 Dropbox 音频播放器,可以在这里看到: soundstash.heroku.com

并在此处开源代码:github.com/miketucker/Dropbox-Audio-Player

require 'open-uri'
require 'stringio'
require 'net/http'
require 'uri'
require 'mp3info'

url = URI.parse('http://example.com/filename.mp3') # turn the string into a URI
http = Net::HTTP.new(url.host, url.port) 
req = Net::HTTP::Get.new(url.path) # init a request with the url
req.range = (0..4096) # limit the load to only 4096 bytes
res = http.request(req) # load the mp3 file
child =  # prepare an empty array to store the metadata we grab
Mp3Info.open( StringIO.open(res.body) ) do |m|  #do the parsing
    child['title'] = m.tag.title 
    child['album'] = m.tag.album 
    child['artist'] = m.tag.artist
    child['length'] = m.length 
end

【讨论】:

太棒了!请注意 child=[] 应该是 child=

以上是关于使用 ruby​​ mp3info 从外部站点读取 mp3 ID3(不加载整个文件)的主要内容,如果未能解决你的问题,请参考以下文章

如何为用户“伪装”或“重命名”页面名称/位置/ URL,但仍允许外部站点通过HTTP_REFERER正确读取真实的URL

从外部站点向 Laravel 发送 POST 请求

Android应用开发--MP3音乐播放器代码实现

使 WordPress 站点可以从 LAN 内部和外部访问

从外部方法调用 ruby​​ 循环上的下一个

无法从 Ubuntu 服务器上的外部站点连接到 phpMyAdmin