From: "Florian Groß" Date: 2005-02-17T07:48:28+09:00 Subject: Re: Reading mp3 files --------------030302020306080604030503 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Scott Rubin wrote: > I've been writing some simple music collection management scripts in > ruby lately, and it seems to be going well. I found ruby id3 with a > google search, it while not perfect it seems to meet my needs. However, > I can't seem to find any ruby library/class that will help me get > information out of mp3/ogg/etc. files that is not ID3. For example I > would like to examine any mp3 file and determine its bitrate and > playtime. Is there a utility to give me this functionality or am I going > to have to write a wrapper for a C library? Here's a little bit of Ruby code a friend of me wrote -- it will not do everything you want and might even fail at some times, but it should at least get you started. --------------030302020306080604030503 Content-Type: application/x-ruby; name="meta.rb" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="meta.rb" IyBUaGlzIHdvcmssIGluY2x1ZGluZyB0aGUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24g YW5kIHJlbGF0ZWQgZGF0YSwgCiMgaXMgcGxhY2VkIGludG8gdGhlIHB1YmxpYyBkb21haW4u CgpyZXF1aXJlICdpY29udicKCmNsYXNzIFZvcmJpc0hlYWRlcgoJZGVmIGluaXRpYWxpemUo aW8pCgkJY2xhc3MgPDwgaW8KCQkJZGVmIHJlYWRfaTsgcmVhZCg0KS51bnBhY2soIlYiKVsw XTsgZW5kCgkJCWRlZiByZWFkX2I7IHJlYWQoMSlbMF07IGVuZAoJCWVuZAoJCQoJCWlvLnNl ZWsoMCkKCQkKCQkyLnRpbWVzIHsKCQkJcmFpc2UgIlN0cmVhbSBkb2VzIG5vdCBjb250YWlu IGEgdmFsaWQgT2dnIHN0cmVhbSIgIGlmIGlvLnJlYWQoNCkgIT0gIk9nZ1MiCgkJCWlvLnJl YWQoMjIpICMgb2dnIGZyYW1lIGhlYWRlcgoJCQlpby5yZWFkKGlvLnJlYWRfYikgIyBzZWdt ZW50IHRhYmxlCgkJCQoJCQljYXNlIHMgPSBpby5yZWFkKDcpCgkJCQl3aGVuIC9ceDAxdm9y YmlzLyAjIGlkZW50aWZpY2F0aW9uIGhlYWRlciBmb2xsb3dzCgkJCQkJQHZlcnNpb24gID0g aW8ucmVhZF9pCgkJCQkJQGNoYW5uZWxzID0gaW8ucmVhZF9iCgkJCQkJQHJhdGUgICAgID0g aW8ucmVhZF9pCgkJCQkJQGJpdHJhdGVfbWluID0gaW8ucmVhZF9pLnRvX2YgLyAxMDAwCgkJ CQkJQGJpdHJhdGVfbm9tID0gaW8ucmVhZF9pLnRvX2YgLyAxMDAwCgkJCQkJQGJpdHJhdGVf bWF4ID0gaW8ucmVhZF9pLnRvX2YgLyAxMDAwCgkJCQkJQGZvcm1hdCA9IDp2b3JiaXMKCQkJ CQlpby5yZWFkKDIpICMgYmxvY2tzaXplICsgZnJhbWluZyBiaXQgKGJ5dGU/KQoJCQkJd2hl biAvXHgwM3ZvcmJpcy8gIyBjb21tZW50IGhlYWRlciBmb2xsb3dzCgkJCQkJQHZlbmRvciA9 IGlvLnJlYWQoaW8ucmVhZF9pKQoJCQkJCUBjb21tZW50cyA9IHt9CgkJCQkJaW8ucmVhZF9p LnRpbWVzIHsgCgkJCQkJCWlmIGlvLnJlYWQoaW8ucmVhZF9pKSA9fiAvKFtePV0qKT0oLiop LwoJCQkJCQkJQGNvbW1lbnRzWyQxLnVwY2FzZV0gPSBJY29udi5jb252KCJpc28tODg1OS0x NSIsICJ1dGY4IiwgJDIpCgkJCQkJCWVuZAoJCQkJCX0KCQkJCWVsc2UKCQkJCQlyYWlzZSAi U3RyZWFtIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBWb3JiaXMgYml0c3RyZWFtIiAKCQkJ ZW5kCgkJfQoJZW5kCgoJZGVmIHRvX3MKCQkiT2dnL1ZvcmJpcyBzdHJlYW1cbiIgKwoJCSJW ZXJzaW9uOiAje0B2ZXJzaW9ufVxuIiArCgkJIlZlbmRvcjogI3tAdmVuZG9yfVxuIiArCgkJ IkNoYW5uZWxzOiAje0BjaGFubmVsc31cbiIgKwoJCSJSYXRlOiAje0ByYXRlfVxuIiArCgkJ Ik5vbWluYWwgYml0cmF0ZSIgKyAoQGJpdHJhdGVfbm9tID4gMCA/ICgiOiAiICsgQGJpdHJh dGVfbm9tLnRvX3MgKyAiIGtiL3MiKSA6ICIgbm90IHNldCIpICsgIlxuIiArCgkJIlVwcGVy IGJpdHJhdGUiICAgKyAoQGJpdHJhdGVfbWF4ID4gMCA/ICgiOiAiICsgQGJpdHJhdGVfbWF4 LnRvX3MgKyAiIGtiL3MiKSA6ICIgbm90IHNldCIpICsgIlxuIiArCgkJIkxvd2VyIGJpdHJh dGUiICAgKyAoQGJpdHJhdGVfbWluID4gMCA/ICgiOiAiICsgQGJpdHJhdGVfbWluLnRvX3Mg KyAiIGtiL3MiKSA6ICIgbm90IHNldCIpICsgIlxuIiArCgkJIkNvbW1lbnRzOlxuIiArIEBj b21tZW50cy5tYXAgeyB8ayx2fCAiXHQje2sudXBjYXNlfT0je3Z9XG4iIH0uam9pbgoJZW5k CgoJZGVmIGFydGlzdDsgQGNvbW1lbnRzWyJBUlRJU1QiXTsgICAgICBlbmQKCWRlZiBhbGJ1 bTsgIEBjb21tZW50c1siQUxCVU0iXTsgICAgICAgZW5kCglkZWYgdGl0bGU7ICBAY29tbWVu dHNbIlRJVExFIl07ICAgICAgIGVuZAoJZGVmIHRyYWNrOyAgQGNvbW1lbnRzWyJUUkFDS05V TUJFUiJdOyBlbmQKCWRlZiBkYXRlOyAgIEBjb21tZW50c1siREFURSJdOyAgICAgICAgZW5k CmVuZAoKY2xhc3MgSUQzdjFIZWFkZXIKCWRlZiBpbml0aWFsaXplKGlvKQoJCWNsYXNzIDw8 IGlvCgkJCWRlZiByZWFkX3MobWF4X2xlbik7IChyZWFkKG1heF9sZW4pKyJcMCIpLnVucGFj aygiWioiKVswXTsgZW5kCgkJCWRlZiByZWFkX2I7IHJlYWQoMSlbMF07IGVuZAoJCWVuZAoJ CQoJCWlvLnNlZWsoLTEyOCwgSU86OlNFRUtfRU5EKQoJCQoJCXJhaXNlICJPb3BzPyIgaWYg aW8ucmVhZCgzKSAhPSAiVEFHIgoJCQoJCUBjb21tZW50cyA9IHt9CgkJQGNvbW1lbnRzWyJU SVRMRSJdICAgPSBpby5yZWFkX3MoMzApCgkJQGNvbW1lbnRzWyJBUlRJU1QiXSAgPSBpby5y ZWFkX3MoMzApCgkJQGNvbW1lbnRzWyJBTEJVTSJdICAgPSBpby5yZWFkX3MoMzApCgkJQGNv bW1lbnRzWyJEQVRFIl0gICAgPSBpby5yZWFkX3MoNCkKCgkJYyA9IGlvLnJlYWQoMzApCgkJ CQoJCUBjb21tZW50c1siVFJBQ0tOVU1CRVIiXSA9IGNbMjldIGlmIChjWzI4XSA9PSAwKSBh bmQgKGNbMjldICE9IDApCgkJQGNvbW1lbnRzWyJDT01NRU5UIl0gICAgID0gYy51bnBhY2so IloqIilbMF0KCgkJQGNvbW1lbnRzWyJHRU5SRSJdICAgICAgID0gaW8ucmVhZF9iCgllbmQK CWRlZiB0b19zCgkJIklEM3YxIFRhZzpcbiIgKwoJCUBjb21tZW50cy5tYXAgeyB8ayx2fCAi XHQje2suY2FwaXRhbGl6ZX06ICN7dn1cbiIgfS5qb2luCgllbmQKCWRlZiBhcnRpc3Q7IEBj b21tZW50c1siQVJUSVNUIl07ICAgICAgZW5kCglkZWYgYWxidW07ICBAY29tbWVudHNbIkFM QlVNIl07ICAgICAgIGVuZAoJZGVmIHRpdGxlOyAgQGNvbW1lbnRzWyJUSVRMRSJdOyAgICAg ICBlbmQKCWRlZiB0cmFjazsgIEBjb21tZW50c1siVFJBQ0tOVU1CRVIiXTsgZW5kCglkZWYg ZGF0ZTsgICBAY29tbWVudHNbIkRBVEUiXTsgICAgICAgIGVuZAplbmQKCmNsYXNzIElEM3Yy SGVhZGVyCglkZWYgaW5pdGlhbGl6ZShpbykKCQljbGFzcyA8PCBpbwoJCQlkZWYgcmVhZF9p OyBjID0gcmVhZCg0KTsgY1swXSooMHg4MCoqMykgKyBjWzFdKigweDgwKioyKSArIGNbMl0q MHg4MCArIGNbM107IGVuZAoJCWVuZAoKCQlpby5zZWVrKDApCgkJIAoJCWlmIGlvLnJlYWQo MykgPT0gIklEMyIKCQkJdl9tYWosIHZfbWluLCBmbGFncyA9IGlvLnJlYWQoMykudW5wYWNr KCJDQ0I0IikKCQkJdW5zeW5jLCBleHRfaGVhZGVyLCBleHAsIGZvb3RlciA9ICgwLi4zKS5j b2xsZWN0IHsgfGl8IGZsYWdzW2ldLmNociA9PSAnMScgfQoJCQl0YWdfbGVuID0gaW8ucmVh ZF9pCgkJCWlmIGV4dF9oZWFkZXIKCQkJCWV4dF9zaXplID0gaW8ucmVhZF9pIC0gNgoJCQkJ aW8ucmVhZCgyKQoJCQkJaW8ucmVhZChleHRfc2l6ZSkKCQkJZW5kCgkJCUBjb21tZW50cyA9 IHt9CgkJCWxvb3AgZG8KCQkJCWJyZWFrIGlmIGlvLnBvcyA+PSB0YWdfbGVuCgkJCQluYW1l ID0gaW8ucmVhZCg0KQoJCQkJc2l6ZSA9IGlvLnJlYWQoNCkudW5wYWNrKCJOIilbMF0KCQkJ CXNpemUgPSA1MDAwMCBpZiBzaXplID4gNTAwMDAKCQkJCWZsYWdzID0gaW8ucmVhZCgyKQoJ CQkJIyByYWlzZSAiSUQzdjIgVGFnIGZ1Y2tlZCIgaWYgc2l6ZSA+IDMyMDAwCgkJCQlkYXRh ID0gaW8ucmVhZChzaXplKQoJCQkJaWYgbmFtZSAhPSAiXDAwMFwwMDBcMDAwXDAwMCIKCQkJ CQlAY29tbWVudHNbbmFtZV0gPSBkYXRhWzEuLi0xXQoJCQkJZW5kCgkJCWVuZAoJCWVsc2UK CQkJcmFpc2UgIk5vIElEM3YyIFRhZyBmb3VuZCIKCQllbmQKCWVuZAoJZGVmIHRvX3MKCQki SUQzdjIgVGFnOlxuIiArIEBjb21tZW50cy5tYXAgeyB8ayx2fCAiXHQje2t9OiAje3Z9XG4i IH0uam9pbgoJZW5kCglkZWYgYXJ0aXN0OyBAY29tbWVudHNbIlRQRTEiXTsgZW5kCglkZWYg YWxidW07ICBAY29tbWVudHNbIlRBTEIiXTsgZW5kCglkZWYgdGl0bGU7ICBAY29tbWVudHNb IlRJVDIiXTsgZW5kCglkZWYgdHJhY2s7ICBAY29tbWVudHNbIlRSQ0siXTsgZW5kCglkZWYg ZGF0ZTsgICBAY29tbWVudHNbIlRZRVIiXTsgZW5kCmVuZAoKY2xhc3MgQVBFRm9vdGVyCglk ZWYgaW5pdGlhbGl6ZShpbykKCQlpby5zZWVrKC0zMiwgSU86OlNFRUtfRU5EKQoJCXJhaXNl ICJObyBBUEUgVGFnIGZvdW5kIiB1bmxlc3MgaW8ucmVhZCgxMikgPX4gL15BUEVUQUdFWC8K CQlsZW4gPSBpby5yZWFkKDQpLnVucGFjaygiViIpWzBdOwoJCWlvLnNlZWsoLTMyIC0gbGVu LCBJTzo6U0VFS19FTkQpCgkJdGFnID0gaW8ucmVhZChsZW4pCgkJQGNvbW1lbnRzID0ge30K CQl0YWcuc2xpY2UhKDAsIDMyKS5sZW5ndGgKCQl3aGlsZSB0YWcubGVuZ3RoID4gMAoJCQl2 c2l6ZSwgZmxhZ3MgPSAqdGFnLnNsaWNlISgwLDgpLnVucGFjaygiVlYiKQoJCQlrZXkgPSB0 YWcuc2xpY2UhKC9eW15cMF0qXDAvKS5zdHJpcAoJCQlAY29tbWVudHNba2V5XSA9IHRhZy5z bGljZSEoMCwgdnNpemUpCgkJZW5kCgllbmQKCWRlZiBhcnRpc3Q7IEBjb21tZW50c1siQXJ0 aXN0Il07IGVuZAoJZGVmIGFsYnVtOyAgQGNvbW1lbnRzWyJBbGJ1bSJdOyBlbmQKCWRlZiB0 aXRsZTsgIEBjb21tZW50c1siVGl0bGUiXTsgZW5kCglkZWYgdHJhY2s7ICBAY29tbWVudHNb IlRyYWNrIl07IGVuZAoJZGVmIGRhdGU7ICAgQGNvbW1lbnRzWyJZZWFyIl07IGVuZAplbmQK CmNsYXNzIFRhZ2dlZEZpbGUKCWRlZiBpbml0aWFsaXplKGZuKQoJCUB0YWdzID0gW10KCQlG aWxlLm9wZW4oZm4sICJyIikgeyB8ZnwKCQkJY2FzZSBGaWxlLmV4dG5hbWUoZm4pCgkJCQl3 aGVuICIub2dnIiB0aGVuIEB0YWdzIDw8IFZvcmJpc0hlYWRlci5uZXcoZikKCQkJCXdoZW4g Ii5tcGMiIHRoZW4gQHRhZ3MgPDwgQVBFRm9vdGVyLm5ldyhmKQoJCQkJd2hlbiAiLm1wMyIg dGhlbgoJCQkJCUB0YWdzIDw8IElEM3YySGVhZGVyLm5ldyhmKSBpZiBmLnJlYWQoMykgPT0g IklEMyIKCQkJCQlmLnNlZWsoLTEyOCwgSU86OlNFRUtfRU5EKQoJCQkJCUB0YWdzIDw8IElE M3YxSGVhZGVyLm5ldyhmKSBpZiBmLnJlYWQoMykgPT0gIlRBRyIKCQkJCWVsc2UKCQkJCQly YWlzZSAiVW5rbm93biBmaWxldHlwZSBmb3IgI3tmbn0iCgkJCWVuZAoJCX0KCQlAdGFncy5j b21wYWN0IQoJCXJhaXNlICJObyB0YWcgZm91bmQiIGlmIEB0YWdzLmVtcHR5PwoJZW5kCglk ZWYgdG9fcyhjb21wYWN0ID0gZmFsc2UpCgkJaWYgY29tcGFjdAoJCQlhcnRpc3QgPyAiI3t0 cmFjay5yanVzdCgyKX0uICN7YXJ0aXN0fSAtICN7dGl0bGV9IiA6ICIje3RyYWNrLnJqdXN0 KDIpfS4gI3t0aXRsZX0iCgkJZWxzZQoJCQkiQXJ0aXN0OiAje2FydGlzdH1cbiIgKwoJCQki VGl0bGU6ICAje3RpdGxlfVxuIiArCgkJCSJBbGJ1bTogICN7YWxidW19XG4iICsKCQkJIlRy YWNrOiAgI3t0cmFja31cbiIgKwoJCQkiRGF0ZTogICAje2RhdGV9XG4iCgkJZW5kCgllbmQK CWRlZiBhcnRpc3Q7IEB0YWdzWzBdLmFydGlzdDsgZW5kCglkZWYgdGl0bGU7ICBAdGFnc1sw XS50aXRsZTsgIGVuZAoJZGVmIGFsYnVtOyAgQHRhZ3NbMF0uYWxidW07ICBlbmQKCWRlZiB0 cmFjazsgIEB0YWdzWzBdLnRyYWNrID1+IC8oWzAtOV0qKS87ICQxLnRvX2kudG9fczsgZW5k CglkZWYgZGF0ZTsgICBAdGFnc1swXS5kYXRlOyAgIGVuZAplbmQKCkFSR1YuZWFjaCB7IHxm bnwgcHV0cyBUYWdnZWRGaWxlLm5ldyhmbikudG9fcyh0cnVlKSB9Cg== --------------030302020306080604030503--