ruby-mp3info 0.8 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/History.txt +5 -0
- data/README.md +58 -50
- data/Rakefile +0 -2
- data/lib/mp3info.rb +4 -3
- data/lib/mp3info/extension_modules.rb +0 -1
- data/lib/mp3info/id3v2.rb +2 -4
- data/test/test_ruby-mp3info.rb +15 -7
- metadata +14 -21
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 421738e99b09100f70bdf70796c8f700b8a2abfd
|
4
|
+
data.tar.gz: c3d33ce01228e74e48ceee95696f422800f40323
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8265aa027cb141ea232c63b3209f9b3e4e42d02cae25626078d2e7eed4d7c972f14b4804195e32c58e5eb42a8ede15da3ecc638a6d1329cf5ebce0a8c172ce54
|
7
|
+
data.tar.gz: f8c3f0d2128173c554f584f0c8b636abe00ae8311b48d4b65003cddc87baf49db074b4fa04fd4f118ad42fa1d65501b95a1634b012055359b9a38a57b2ab401a
|
data/History.txt
CHANGED
data/README.md
CHANGED
@@ -18,56 +18,64 @@ ruby-mp3info read low-level informations and manipulate tags on mp3 files.
|
|
18
18
|
## Synopsis
|
19
19
|
|
20
20
|
```ruby
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
21
|
+
require "mp3info"
|
22
|
+
|
23
|
+
# Read and display infos & tags
|
24
|
+
|
25
|
+
Mp3Info.open("myfile.mp3") do |mp3info|
|
26
|
+
puts mp3info
|
27
|
+
end
|
28
|
+
|
29
|
+
# read/write tag1 and tag2 with Mp3Info#tag attribute
|
30
|
+
# when reading tag2 have priority over tag1
|
31
|
+
# when writing, each tag is written.
|
32
|
+
|
33
|
+
Mp3Info.open("myfile.mp3") do |mp3|
|
34
|
+
puts mp3.tag.title
|
35
|
+
puts mp3.tag.artist
|
36
|
+
puts mp3.tag.album
|
37
|
+
puts mp3.tag.tracknum
|
38
|
+
mp3.tag.title = "track title"
|
39
|
+
mp3.tag.artist = "artist name"
|
40
|
+
end
|
41
|
+
|
42
|
+
# tags are written when calling Mp3Info#close or at the end of the #open block
|
43
|
+
|
44
|
+
### access id3v2 tags
|
45
|
+
|
46
|
+
Mp3Info.open("myfile.mp3") do |mp3|
|
47
|
+
# you can access four letter v2 tags like this
|
48
|
+
puts mp3.tag2.TIT2
|
49
|
+
mp3.tag2.TIT2 = "new TIT2"
|
50
|
+
# or like that
|
51
|
+
mp3.tag2["TIT2"]
|
52
|
+
# at this time, only COMM tag is processed after reading and before writing
|
53
|
+
# according to ID3v2#options hash
|
54
|
+
mp3.tag2.options[:lang] = "FRE"
|
55
|
+
mp3.tag2.COMM = "my comment in french, correctly handled when reading and writing"
|
56
|
+
end
|
57
|
+
|
58
|
+
### image manipulation
|
59
|
+
|
60
|
+
file = File.new('input_img','rb')
|
61
|
+
Mp3Info.open '1.mp3' do |m|
|
62
|
+
pictures = m.tag2.pictures # array of images :
|
63
|
+
pictures.each do |description, data|
|
64
|
+
# description ends with (.jpg / .png) for easy writing to file
|
65
|
+
File.binwrite(description, data)
|
66
|
+
end
|
67
|
+
m.tag2.remove_pictures # remove all images
|
68
|
+
|
69
|
+
m.tag2.add_picture(file.read) # add a single image to APIC tag
|
70
|
+
# **optionally**, you may include options for the image tag to add_picture():
|
71
|
+
# options = { mime: 'jpeg|gif|png', description: "description",
|
72
|
+
# pic_type: 0 }
|
73
|
+
# There is no need to specify mime or options because the mime is guessed based on the input image
|
74
|
+
# Only one image is permitted in the mp3 for compatibility. add_picture() overwrites all previous images.
|
75
|
+
# Please note:
|
76
|
+
# If supplying :mime option just supply the mime 'jpeg', 'gif' or 'png', the code adds the "image/.." for you!
|
77
|
+
# e.g. m.tag2.add_picture(file.read, mime: 'jpeg', pic_type: 3) gets a mime "image/jpeg"
|
78
|
+
end
|
71
79
|
```
|
72
80
|
|
73
81
|
## Requirements
|
data/Rakefile
CHANGED
data/lib/mp3info.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# coding:utf-8
|
2
2
|
# License:: Ruby
|
3
3
|
# Author:: Guillaume Pierronnet (mailto:guillaume.pierronnet@gmail.com)
|
4
|
-
# Website:: http://ruby-mp3info.rubyforge.org/
|
5
4
|
|
6
5
|
require "fileutils"
|
7
6
|
require "stringio"
|
@@ -18,7 +17,7 @@ end
|
|
18
17
|
|
19
18
|
class Mp3Info
|
20
19
|
|
21
|
-
VERSION = "0.8"
|
20
|
+
VERSION = "0.8.1"
|
22
21
|
|
23
22
|
LAYER = [ nil, 3, 2, 1]
|
24
23
|
BITRATE = {
|
@@ -443,7 +442,9 @@ class Mp3Info
|
|
443
442
|
# @io.seek(@io.get_syncsafe - 4, IO::SEEK_CUR) if ext_header
|
444
443
|
# @io.seek(tag2_len, IO::SEEK_CUR)
|
445
444
|
# end
|
446
|
-
|
445
|
+
filename_splitted = File.split(@filename_or_io)
|
446
|
+
filename_splitted[-1] = ".#{filename_splitted[-1]}.tmp"
|
447
|
+
tempfile_name = File.join(filename_splitted)
|
447
448
|
File.open(tempfile_name, "wb") do |tempfile|
|
448
449
|
unless @tag2.empty?
|
449
450
|
tempfile.write(@tag2.to_bin)
|
data/lib/mp3info/id3v2.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# License:: Ruby
|
3
3
|
# Author:: Guillaume Pierronnet (mailto:guillaume.pierronnet@gmail.com)
|
4
|
-
# Website:: http://ruby-mp3info.rubyforge.org/
|
5
4
|
|
6
5
|
require "delegate"
|
7
6
|
|
@@ -305,7 +304,7 @@ class ID3v2 < DelegateClass(Hash)
|
|
305
304
|
end
|
306
305
|
|
307
306
|
puts "analysing image: #{header.inspect}..." if $DEBUG
|
308
|
-
|
307
|
+
_, _, desc, data = pic[mime_pos, pic.length].unpack('Z*hZ*a*')
|
309
308
|
|
310
309
|
if mime != "dat" and (!data.match(start) or data.nil?)
|
311
310
|
real_start = pic =~ start
|
@@ -594,9 +593,8 @@ class ID3v2 < DelegateClass(Hash)
|
|
594
593
|
|
595
594
|
### this is especially useful for printing out APIC data because
|
596
595
|
### only the header of the APIC tag is of interest
|
597
|
-
### The result also shows some bytes escaped for cleaner display
|
598
596
|
def pretty_header(str, chars=128)
|
599
|
-
"#{str.unpack("a#{chars}").first}<<<...snip...>>>".
|
597
|
+
"#{str.unpack("a#{chars}").first}<<<...snip...>>>".inspect[1..-2]
|
600
598
|
end
|
601
599
|
|
602
600
|
|
data/test/test_ruby-mp3info.rb
CHANGED
@@ -64,7 +64,7 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
64
64
|
f.write(str)
|
65
65
|
end
|
66
66
|
assert_raises(Mp3InfoError) do
|
67
|
-
|
67
|
+
Mp3Info.new(TEMP_FILE)
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
@@ -142,7 +142,7 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
142
142
|
end
|
143
143
|
|
144
144
|
def test_removetag2
|
145
|
-
|
145
|
+
write_tag2_to_temp_file("TIT2" => "sdfqdsf")
|
146
146
|
|
147
147
|
assert( Mp3Info.hastag2?(TEMP_FILE) )
|
148
148
|
Mp3Info.removetag2(TEMP_FILE)
|
@@ -155,7 +155,7 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
155
155
|
end
|
156
156
|
assert(Mp3Info.hastag1?(TEMP_FILE))
|
157
157
|
|
158
|
-
|
158
|
+
write_tag2_to_temp_file(DUMMY_TAG2)
|
159
159
|
assert(Mp3Info.hastag2?(TEMP_FILE))
|
160
160
|
end
|
161
161
|
|
@@ -189,13 +189,21 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
189
189
|
assert_equal( "2.3.0", written_tag.version )
|
190
190
|
end
|
191
191
|
|
192
|
+
=begin
|
193
|
+
# test for good output of APIC tag inspect (escaped and snipped)
|
194
|
+
def test_id3v2_to_inspect_hash
|
195
|
+
Mp3Info.open(TEMP_FILE) do |mp3|
|
196
|
+
mp3.tag2.APIC = "\0testing.jpg\0" * 20
|
197
|
+
assert_match(/\\0testing\.jpg\\0.*<<<\.\.\.snip\.\.\.>>>$/, mp3.tag2.to_inspect_hash["APIC"])
|
198
|
+
end
|
199
|
+
end
|
200
|
+
=end
|
201
|
+
|
192
202
|
# test for good output of APIC tag inspect (escaped and snipped)
|
193
203
|
def test_id3v2_to_inspect_hash
|
194
204
|
Mp3Info.open(TEMP_FILE) do |mp3|
|
195
205
|
mp3.tag2.APIC = "\x00testing.jpg\x00" * 20
|
196
|
-
|
197
|
-
snipped_str = escaped_str.unpack('a185').first + "<<<...snip...>>>"
|
198
|
-
assert_equal(snipped_str, mp3.tag2.to_inspect_hash["APIC"])
|
206
|
+
assert_match(/^(\\x00testing.jpg\\x00)+.*<<<\.\.\.snip\.\.\.>>>$/, mp3.tag2.to_inspect_hash["APIC"])
|
199
207
|
end
|
200
208
|
end
|
201
209
|
|
@@ -469,7 +477,7 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
469
477
|
io = load_string_io
|
470
478
|
assert(Mp3Info.hastag1?(io))
|
471
479
|
|
472
|
-
|
480
|
+
write_tag2_to_temp_file(DUMMY_TAG2)
|
473
481
|
io = load_string_io
|
474
482
|
assert(Mp3Info.hastag2?(io))
|
475
483
|
end
|
metadata
CHANGED
@@ -1,36 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-mp3info
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 0.8.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Guillaume Pierronnet
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-10-28 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
14
|
+
name: rdoc
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
19
|
+
version: '3.10'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
26
|
+
version: '3.10'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: hoe
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ~>
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ~>
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -63,30 +58,28 @@ files:
|
|
63
58
|
- .gemtest
|
64
59
|
homepage: http://github.com/moumar/ruby-mp3info
|
65
60
|
licenses: []
|
61
|
+
metadata: {}
|
66
62
|
post_install_message:
|
67
63
|
rdoc_options:
|
68
|
-
- --
|
69
|
-
-
|
70
|
-
- --quiet
|
64
|
+
- --main
|
65
|
+
- README.md
|
71
66
|
require_paths:
|
72
67
|
- lib
|
73
68
|
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
69
|
requirements:
|
76
|
-
- -
|
70
|
+
- - '>='
|
77
71
|
- !ruby/object:Gem::Version
|
78
72
|
version: '0'
|
79
73
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
-
none: false
|
81
74
|
requirements:
|
82
|
-
- -
|
75
|
+
- - '>='
|
83
76
|
- !ruby/object:Gem::Version
|
84
77
|
version: '0'
|
85
78
|
requirements: []
|
86
79
|
rubyforge_project: ruby-mp3info
|
87
|
-
rubygems_version: 1.
|
80
|
+
rubygems_version: 2.1.5
|
88
81
|
signing_key:
|
89
|
-
specification_version:
|
82
|
+
specification_version: 4
|
90
83
|
summary: ruby-mp3info read low-level informations and manipulate tags on mp3 files.
|
91
84
|
test_files:
|
92
85
|
- test/test_ruby-mp3info.rb
|