mms2r 3.4.1 → 3.5.0
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.
- data/History.txt +8 -0
- data/conf/mms2r_media.yml +1 -1
- data/lib/mms2r.rb +5 -1
- data/lib/mms2r/media/sprint.rb +12 -8
- data/test/test_mms2r_media.rb +4 -0
- data/test/test_pm_sprint_com.rb +71 -38
- metadata +74 -103
data/History.txt
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
### 3.5.0 / 2011-12-01 (Dr. Milminiman Lamilim Swimwambli - Marriage expert)
|
2
|
+
|
3
|
+
* 1 major bug fix
|
4
|
+
* In Ruby 1.9.X MMS2R::Media::Sprint was not fetching content from Sprint's
|
5
|
+
CDN correctly because the implementation of Net::HTTP in 1.9.X passes a
|
6
|
+
User-Agent header of "Ruby" to which Sprint responds with a fake 500 -
|
7
|
+
with help from James McGrath
|
8
|
+
|
1
9
|
### 3.4.1 / 2011-11-06 (Fatty Ding-Dongs, Dethklok foster child)
|
2
10
|
|
3
11
|
* 2 major enhancements
|
data/conf/mms2r_media.yml
CHANGED
data/lib/mms2r.rb
CHANGED
@@ -39,8 +39,12 @@ module MMS2R
|
|
39
39
|
##
|
40
40
|
# MMS2R library version
|
41
41
|
|
42
|
-
VERSION = '3.
|
42
|
+
VERSION = '3.5.0'
|
43
43
|
|
44
|
+
##
|
45
|
+
# Spoof User-Agent, primarily for the Sprint CDN
|
46
|
+
|
47
|
+
USER_AGENT = "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1C28 Safari/419.3"
|
44
48
|
end
|
45
49
|
|
46
50
|
# Simple convenience function to make it a one-liner:
|
data/lib/mms2r/media/sprint.rb
CHANGED
@@ -130,17 +130,21 @@ module MMS2R
|
|
130
130
|
srcs.each do |src|
|
131
131
|
begin
|
132
132
|
|
133
|
-
|
133
|
+
uri = URI.parse(CGI.unescapeHTML(src))
|
134
134
|
unless @is_video
|
135
135
|
query={}
|
136
|
-
|
136
|
+
uri.query.split('&').each{|a| p=a.split('='); query[p[0]] = p[1]}
|
137
137
|
query.delete_if{|k, v| k == 'limitsize' or k == 'squareoutput' }
|
138
|
-
|
138
|
+
uri.query = query.map{|k,v| "#{k}=#{v}"}.join("&")
|
139
139
|
end
|
140
140
|
# sprint is a ghetto, they expect to see & for video request
|
141
|
-
|
141
|
+
uri.query = uri.query.gsub(/&/, "&") if @is_video
|
142
142
|
|
143
|
-
|
143
|
+
connection = Net::HTTP.new(uri.host, uri.port)
|
144
|
+
response, content = connection.get(
|
145
|
+
uri.request_uri,
|
146
|
+
{ "User-Agent" => MMS2R::Media::USER_AGENT }
|
147
|
+
)
|
144
148
|
rescue StandardError => err
|
145
149
|
log("#{self.class} processing error, #{$!}", :error)
|
146
150
|
next
|
@@ -148,19 +152,19 @@ module MMS2R
|
|
148
152
|
|
149
153
|
# if the Sprint content server uses response code 500 when the content is purged
|
150
154
|
# the content type will text/html and the body will be the message
|
151
|
-
if
|
155
|
+
if response.content_type == 'text/html' && response.code == "500"
|
152
156
|
log("Sprint content server returned response code 500", :error)
|
153
157
|
next
|
154
158
|
end
|
155
159
|
|
156
160
|
# setup the file path and file
|
157
161
|
base = /\/RECIPIENT\/([^\/]+)\//.match(src)[1]
|
158
|
-
type =
|
162
|
+
type = response.content_type
|
159
163
|
file_name = "#{base}-#{cnt}.#{self.class.default_ext(type)}"
|
160
164
|
file = File.join(msg_tmp_dir(),File.basename(file_name))
|
161
165
|
|
162
166
|
# write it and add it to the media hash
|
163
|
-
type, file = sprint_write_file(type,
|
167
|
+
type, file = sprint_write_file(type, content, file)
|
164
168
|
add_file(type, file) unless type.nil? || file.nil?
|
165
169
|
cnt = cnt + 1
|
166
170
|
end
|
data/test/test_mms2r_media.rb
CHANGED
@@ -43,6 +43,10 @@ class TestMms2rMedia < Test::Unit::TestCase
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
+
def test_faux_user_agent
|
47
|
+
assert_equal "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1C28 Safari/419.3", MMS2R::Media::USER_AGENT
|
48
|
+
end
|
49
|
+
|
46
50
|
def test_class_parse
|
47
51
|
mms = mail('generic.mail')
|
48
52
|
assert_equal ['noreply@rubyforge.org'], mms.from
|
data/test/test_pm_sprint_com.rb
CHANGED
@@ -4,23 +4,37 @@ class TestPmSprintCom < Test::Unit::TestCase
|
|
4
4
|
include MMS2R::TestHelper
|
5
5
|
|
6
6
|
def mock_sprint_image(message_id)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
response = mock('response')
|
8
|
+
body = mock('body')
|
9
|
+
connection = mock('connection')
|
10
|
+
response.expects(:content_type).twice.returns('image/jpeg')
|
11
|
+
response.expects(:code).never
|
12
|
+
Net::HTTP.expects(:new).with('pictures.sprintpcs.com', 80).once.returns connection
|
13
|
+
connection.expects(:get).with(
|
14
|
+
# 1.9.2
|
15
|
+
# '//mmps/RECIPIENT/001_2066c7013e7ca833_1/2?inviteToken=PE5rJ5PdYzzwk7V7zoXU&outquality=90&ext=.jpg&iconifyVideo=true&wm=1'
|
16
|
+
# 1.8.7
|
17
|
+
# '//mmps/RECIPIENT/001_2066c7013e7ca833_1/2?wm=1&ext=.jpg&outquality=90&iconifyVideo=true&inviteToken=PE5rJ5PdYzzwk7V7zoXU'
|
18
|
+
kind_of(String),
|
19
|
+
{ "User-Agent" => MMS2R::Media::USER_AGENT }
|
20
|
+
).once.returns([response, body])
|
14
21
|
end
|
15
22
|
|
16
23
|
def mock_sprint_purged_image(message_id)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
+
response = mock('response')
|
25
|
+
body = mock('body')
|
26
|
+
connection = mock('connection')
|
27
|
+
response.expects(:content_type).once.returns('text/html')
|
28
|
+
response.expects(:code).once.returns('500')
|
29
|
+
Net::HTTP.expects(:new).with('pictures.sprintpcs.com', 80).once.returns connection
|
30
|
+
connection.expects(:get).with(
|
31
|
+
# 1.9.2
|
32
|
+
# '//mmps/RECIPIENT/001_2066c7013e7ca833_1/2?inviteToken=PE5rJ5PdYzzwk7V7zoXU&outquality=90&ext=.jpg&iconifyVideo=true&wm=1'
|
33
|
+
# 1.8.7
|
34
|
+
# '//mmps/RECIPIENT/001_2066c7013e7ca833_1/2?wm=1&ext=.jpg&outquality=90&iconifyVideo=true&inviteToken=PE5rJ5PdYzzwk7V7zoXU'
|
35
|
+
kind_of(String),
|
36
|
+
{ "User-Agent" => MMS2R::Media::USER_AGENT }
|
37
|
+
).once.returns([response, body])
|
24
38
|
end
|
25
39
|
|
26
40
|
def test_mms_should_have_text
|
@@ -50,14 +64,16 @@ class TestPmSprintCom < Test::Unit::TestCase
|
|
50
64
|
def test_should_have_simple_video
|
51
65
|
mail = mail('sprint-video-01.mail')
|
52
66
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
67
|
+
response = mock('response')
|
68
|
+
body = mock('body')
|
69
|
+
connection = mock('connection')
|
70
|
+
response.expects(:content_type).twice.returns('video/quicktime')
|
71
|
+
response.expects(:code).never
|
72
|
+
Net::HTTP.expects(:new).with('pictures.sprintpcs.com', 80).once.returns connection
|
73
|
+
connection.expects(:get).with(
|
74
|
+
kind_of(String),
|
75
|
+
{ "User-Agent" => MMS2R::Media::USER_AGENT }
|
76
|
+
).once.returns([response, body])
|
61
77
|
|
62
78
|
mms = MMS2R::Media.new(mail)
|
63
79
|
assert_equal '2068675309', mms.number
|
@@ -126,22 +142,39 @@ class TestPmSprintCom < Test::Unit::TestCase
|
|
126
142
|
def test_should_have_two_images
|
127
143
|
mail = mail('sprint-two-images-01.mail')
|
128
144
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
+
response = mock('response')
|
146
|
+
body = mock('body')
|
147
|
+
connection = mock('connection')
|
148
|
+
response.expects(:content_type).times(4).returns('image/jpeg')
|
149
|
+
response.expects(:code).never
|
150
|
+
Net::HTTP.expects(:new).with('pictures.sprintpcs.com', 80).twice.returns connection
|
151
|
+
connection.expects(:get).with(
|
152
|
+
kind_of(String),
|
153
|
+
{ "User-Agent" => MMS2R::Media::USER_AGENT }
|
154
|
+
).twice.returns([response, body])
|
155
|
+
|
156
|
+
# response1 = mock('response1')
|
157
|
+
# body1 = mock('body1')
|
158
|
+
# connection1 = mock('connection1')
|
159
|
+
# response1.expects(:content_type).at_least_once.returns('image/jpeg')
|
160
|
+
# response1.expects(:code).never
|
161
|
+
# Net::HTTP.expects(:new).with('pictures.sprintpcs.com', 80).once.returns connection1
|
162
|
+
# connection1.expects(:get).with(
|
163
|
+
# kind_of(String),
|
164
|
+
# { "User-Agent" => MMS2R::Media::USER_AGENT }
|
165
|
+
# ).once.returns([response1, body1])
|
166
|
+
|
167
|
+
# response2 = mock('response2')
|
168
|
+
# body2 = mock('body2')
|
169
|
+
# connection2 = mock('connection2')
|
170
|
+
# response2.expects(:content_type).at_least_once.returns('image/jpeg')
|
171
|
+
# response2.expects(:code).never
|
172
|
+
# Net::HTTP.expects(:new).with('pictures.sprintpcs.com', 80).once.returns connection2
|
173
|
+
# connection2.expects(:get).with(
|
174
|
+
# kind_of(String),
|
175
|
+
# { "User-Agent" => MMS2R::Media::USER_AGENT }
|
176
|
+
# ).once.returns([response2, body2])
|
177
|
+
|
145
178
|
mms = MMS2R::Media.new(mail)
|
146
179
|
assert_equal '2068675309', mms.number
|
147
180
|
assert_equal "pm.sprint.com", mms.carrier
|
metadata
CHANGED
@@ -1,130 +1,109 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: mms2r
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 3.5.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 3
|
8
|
-
- 4
|
9
|
-
- 1
|
10
|
-
version: 3.4.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Mike Mondragon
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-12-02 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: nokogiri
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &20713980 !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
hash: 15
|
29
|
-
segments:
|
30
|
-
- 1
|
31
|
-
- 4
|
32
|
-
- 4
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
33
21
|
version: 1.4.4
|
34
22
|
type: :runtime
|
35
|
-
version_requirements: *id001
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: mail
|
38
23
|
prerelease: false
|
39
|
-
|
24
|
+
version_requirements: *20713980
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: mail
|
27
|
+
requirement: &20712840 !ruby/object:Gem::Requirement
|
40
28
|
none: false
|
41
|
-
requirements:
|
42
|
-
- -
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
hash: 19
|
45
|
-
segments:
|
46
|
-
- 2
|
47
|
-
- 2
|
48
|
-
- 10
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
49
32
|
version: 2.2.10
|
50
33
|
type: :runtime
|
51
|
-
version_requirements: *id002
|
52
|
-
- !ruby/object:Gem::Dependency
|
53
|
-
name: uuidtools
|
54
34
|
prerelease: false
|
55
|
-
|
35
|
+
version_requirements: *20712840
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: uuidtools
|
38
|
+
requirement: &20711600 !ruby/object:Gem::Requirement
|
56
39
|
none: false
|
57
|
-
requirements:
|
58
|
-
- -
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
hash: 9
|
61
|
-
segments:
|
62
|
-
- 2
|
63
|
-
- 1
|
64
|
-
- 1
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
65
43
|
version: 2.1.1
|
66
44
|
type: :runtime
|
67
|
-
version_requirements: *id003
|
68
|
-
- !ruby/object:Gem::Dependency
|
69
|
-
name: exifr
|
70
45
|
prerelease: false
|
71
|
-
|
46
|
+
version_requirements: *20711600
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: exifr
|
49
|
+
requirement: &20710280 !ruby/object:Gem::Requirement
|
72
50
|
none: false
|
73
|
-
requirements:
|
74
|
-
- -
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
hash: 17
|
77
|
-
segments:
|
78
|
-
- 1
|
79
|
-
- 0
|
80
|
-
- 3
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
81
54
|
version: 1.0.3
|
82
55
|
type: :runtime
|
83
|
-
version_requirements: *id004
|
84
|
-
- !ruby/object:Gem::Dependency
|
85
|
-
name: hoe
|
86
56
|
prerelease: false
|
87
|
-
|
57
|
+
version_requirements: *20710280
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: hoe
|
60
|
+
requirement: &20708940 !ruby/object:Gem::Requirement
|
88
61
|
none: false
|
89
|
-
requirements:
|
62
|
+
requirements:
|
90
63
|
- - ~>
|
91
|
-
- !ruby/object:Gem::Version
|
92
|
-
|
93
|
-
segments:
|
94
|
-
- 2
|
95
|
-
- 12
|
96
|
-
version: "2.12"
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '2.12'
|
97
66
|
type: :development
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *20708940
|
69
|
+
description: ! '== DESCRIPTION
|
70
|
+
|
71
|
+
|
102
72
|
MMS2R by Mike Mondragon
|
73
|
+
|
103
74
|
http://mms2r.rubyforge.org/
|
75
|
+
|
104
76
|
https://github.com/monde/mms2r
|
77
|
+
|
105
78
|
https://github.com/monde/mms2r/issues
|
79
|
+
|
106
80
|
http://peepcode.com/products/mms2r-pdf
|
107
|
-
|
81
|
+
|
82
|
+
|
108
83
|
MMS2R is a library that decodes the parts of an MMS message to disk while
|
84
|
+
|
109
85
|
stripping out advertising injected by the mobile carriers. MMS messages are
|
86
|
+
|
110
87
|
multipart email and the carriers often inject branding into these messages. Use
|
88
|
+
|
111
89
|
MMS2R if you want to get at the real user generated content from a MMS without
|
90
|
+
|
112
91
|
having to deal with the cruft from the carriers.
|
113
|
-
|
92
|
+
|
93
|
+
|
114
94
|
If MMS2R is not aware of a particular carrier no extra processing is done to the
|
115
|
-
|
116
|
-
|
95
|
+
|
96
|
+
MMS other than decoding and consolidating its media.'
|
97
|
+
email:
|
117
98
|
- mikemondragon@gmail.com
|
118
99
|
executables: []
|
119
|
-
|
120
100
|
extensions: []
|
121
|
-
|
122
|
-
extra_rdoc_files:
|
101
|
+
extra_rdoc_files:
|
123
102
|
- History.txt
|
124
103
|
- Manifest.txt
|
125
104
|
- README.TMail.txt
|
126
105
|
- README.txt
|
127
|
-
files:
|
106
|
+
files:
|
128
107
|
- .gitignore
|
129
108
|
- Gemfile
|
130
109
|
- Gemfile.lock
|
@@ -312,39 +291,31 @@ files:
|
|
312
291
|
- .gemtest
|
313
292
|
homepage: https://github.com/monde/mms2r
|
314
293
|
licenses: []
|
315
|
-
|
316
294
|
post_install_message:
|
317
|
-
rdoc_options:
|
295
|
+
rdoc_options:
|
318
296
|
- --main
|
319
297
|
- README.txt
|
320
|
-
require_paths:
|
298
|
+
require_paths:
|
321
299
|
- lib
|
322
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
300
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
323
301
|
none: false
|
324
|
-
requirements:
|
325
|
-
- -
|
326
|
-
- !ruby/object:Gem::Version
|
327
|
-
|
328
|
-
|
329
|
-
- 0
|
330
|
-
version: "0"
|
331
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
302
|
+
requirements:
|
303
|
+
- - ! '>='
|
304
|
+
- !ruby/object:Gem::Version
|
305
|
+
version: '0'
|
306
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
332
307
|
none: false
|
333
|
-
requirements:
|
334
|
-
- -
|
335
|
-
- !ruby/object:Gem::Version
|
336
|
-
|
337
|
-
segments:
|
338
|
-
- 0
|
339
|
-
version: "0"
|
308
|
+
requirements:
|
309
|
+
- - ! '>='
|
310
|
+
- !ruby/object:Gem::Version
|
311
|
+
version: '0'
|
340
312
|
requirements: []
|
341
|
-
|
342
313
|
rubyforge_project: mms2r
|
343
314
|
rubygems_version: 1.8.10
|
344
315
|
signing_key:
|
345
316
|
specification_version: 3
|
346
317
|
summary: Extract user media from MMS (and not carrier cruft)
|
347
|
-
test_files:
|
318
|
+
test_files:
|
348
319
|
- test/test_orangemms_net.rb
|
349
320
|
- test/test_waw_plspictures_com.rb
|
350
321
|
- test/test_mediamessaging_o2_co_uk.rb
|