mms2r 1.0.0 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +18 -0
- data/Manifest.txt +13 -0
- data/README.txt +36 -16
- data/Rakefile +1 -1
- data/conf/mms2r_cingularmedia_transform.yml +2 -2
- data/conf/mms2r_nextelmedia_ignore.yml +5 -0
- data/lib/mms2r/media.rb +24 -7
- data/lib/mms2r/nextel_media.rb +11 -0
- data/lib/mms2r/sprint_media.rb +1 -2
- data/lib/mms2r/version.rb +1 -1
- data/test/files/cingularme-text-01.mail +13 -0
- data/test/files/hello_world_mail_multipart.mail +17 -0
- data/test/files/hello_world_mail_plain_no_content_type.mail +7 -0
- data/test/files/hello_world_mail_plain_with_content_type.mail +8 -0
- data/test/files/mmode-image-01.mail +36 -0
- data/test/files/nextel-image-01.mail +46 -0
- data/test/files/simple_image.mail +19 -0
- data/test/files/simple_multipart_alternative.mail +42 -0
- data/test/files/tmobile-image-01.mail +145 -0
- data/test/files/verizon-image-01.mail +7 -778
- data/test/files/verizon-text-01.mail +0 -1
- data/test/files/vtext-text-01.mail +10 -0
- data/test/test_mms2r_cingular.rb +10 -20
- data/test/test_mms2r_media.rb +68 -87
- data/test/test_mms2r_mmode.rb +17 -26
- data/test/test_mms2r_nextel.rb +43 -0
- data/test/test_mms2r_sprint.rb +4 -4
- data/test/test_mms2r_tmobile.rb +18 -145
- data/test/test_mms2r_verizon.rb +20 -6
- metadata +17 -3
data/History.txt
CHANGED
@@ -1,4 +1,22 @@
|
|
1
|
+
== 1.0.2 / 2007-03-07
|
2
|
+
|
3
|
+
* Reorganized tests and fixtures
|
4
|
+
* Added carriers:
|
5
|
+
* Cingular => cingularme.com
|
6
|
+
* Nextel => messaging.nextel.com
|
7
|
+
* Verizon => vtext.com
|
8
|
+
|
9
|
+
== 1.0.2 / 2007-03-07
|
10
|
+
|
11
|
+
* Flubbed RubyForge release ... do not use this.
|
12
|
+
|
1
13
|
== 1.0.0 / 2007-03-06
|
2
14
|
|
3
15
|
* Birthday!
|
16
|
+
* AT&T/Cingular => mmode.com
|
17
|
+
* Cingular => mms.mycingular.com
|
18
|
+
* Sprint => pm.sprint.com
|
19
|
+
* Sprint => messaging.sprintpcs.com
|
20
|
+
* T-Mobile => tmomail.net
|
21
|
+
* Verizon => vzwpix.com
|
4
22
|
|
data/Manifest.txt
CHANGED
@@ -3,6 +3,7 @@ Manifest.txt
|
|
3
3
|
README.txt
|
4
4
|
Rakefile
|
5
5
|
conf/mms2r_cingularmedia_transform.yml
|
6
|
+
conf/mms2r_nextelmedia_ignore.yml
|
6
7
|
conf/mms2r_sprintmedia_ignore.yml
|
7
8
|
conf/mms2r_tmobilemedia_ignore.yml
|
8
9
|
conf/mms2r_verizonmedia_ignore.yml
|
@@ -10,6 +11,7 @@ lib/mms2r.rb
|
|
10
11
|
lib/mms2r/cingular_media.rb
|
11
12
|
lib/mms2r/media.rb
|
12
13
|
lib/mms2r/mmode_media.rb
|
14
|
+
lib/mms2r/nextel_media.rb
|
13
15
|
lib/mms2r/sprint_media.rb
|
14
16
|
lib/mms2r/tmobile_media.rb
|
15
17
|
lib/mms2r/verizon_media.rb
|
@@ -38,17 +40,28 @@ lib/vendor/tmail/scanner_r.rb
|
|
38
40
|
lib/vendor/tmail/stringio.rb
|
39
41
|
lib/vendor/tmail/tmail.rb
|
40
42
|
lib/vendor/tmail/utils.rb
|
43
|
+
test/files/cingularme-text-01.mail
|
41
44
|
test/files/dot.jpg
|
45
|
+
test/files/hello_world_mail_multipart.mail
|
46
|
+
test/files/hello_world_mail_plain_no_content_type.mail
|
47
|
+
test/files/hello_world_mail_plain_with_content_type.mail
|
48
|
+
test/files/mmode-image-01.mail
|
49
|
+
test/files/nextel-image-01.mail
|
50
|
+
test/files/simple_image.mail
|
51
|
+
test/files/simple_multipart_alternative.mail
|
42
52
|
test/files/sprint-image-01.mail
|
43
53
|
test/files/sprint-text-01.mail
|
44
54
|
test/files/sprint-video-01.mail
|
45
55
|
test/files/sprint.mov
|
56
|
+
test/files/tmobile-image-01.mail
|
46
57
|
test/files/verizon-image-01.mail
|
47
58
|
test/files/verizon-text-01.mail
|
48
59
|
test/files/verizon-video-01.mail
|
60
|
+
test/files/vtext-text-01.mail
|
49
61
|
test/test_mms2r_cingular.rb
|
50
62
|
test/test_mms2r_media.rb
|
51
63
|
test/test_mms2r_mmode.rb
|
64
|
+
test/test_mms2r_nextel.rb
|
52
65
|
test/test_mms2r_sprint.rb
|
53
66
|
test/test_mms2r_tmobile.rb
|
54
67
|
test/test_mms2r_verizon.rb
|
data/README.txt
CHANGED
@@ -8,47 +8,67 @@ http://mms2r.rubyforge.org/
|
|
8
8
|
|
9
9
|
MMS2R is a library that decodes the parts of an MMS message to disk while
|
10
10
|
stripping out advertising injected by the cellphone carriers. MMS messages are
|
11
|
-
multipart email and the carriers often inject branding into these messages.
|
11
|
+
multipart email and the carriers often inject branding into these messages. Use
|
12
|
+
MMS2R if you want to get at the real user generated content from a MMS without
|
13
|
+
having to deal with the garbage from the carriers.
|
12
14
|
|
13
15
|
If MMS2R is not aware of a particular carrier no extra processing is done
|
14
16
|
to the MMS other than decoding and consolidating its media.
|
15
17
|
|
16
18
|
Contact the author to add additional carriers to be processed by the library.
|
17
19
|
|
18
|
-
== FEATURES/PROBLEMS:
|
19
|
-
|
20
20
|
Corpus of carriers currently processed by MMS2R:
|
21
21
|
|
22
22
|
* AT&T/Cingular => mmode.com
|
23
23
|
* Cingular => mms.mycingular.com
|
24
|
+
* Cingular => cingularme.com
|
25
|
+
* Nextel => messaging.nextel.com
|
24
26
|
* Sprint => pm.sprint.com
|
25
27
|
* Sprint => messaging.sprintpcs.com
|
26
28
|
* T-Mobile => tmomail.net
|
27
29
|
* Verizon => vzwpix.com
|
28
|
-
|
30
|
+
* Verizon => vtext.com
|
31
|
+
|
32
|
+
== FEATURES/PROBLEMS:
|
33
|
+
|
34
|
+
TMail from 1.3.1 of ActionMailer is shipped as a vendor library with MMS2R
|
35
|
+
|
29
36
|
== SYNOPSIS:
|
30
37
|
|
31
38
|
require 'rubygems'
|
32
39
|
require 'mms2r'
|
40
|
+
require 'mms2r/media'
|
33
41
|
require 'tmail'
|
34
|
-
|
35
|
-
|
42
|
+
require 'fileutils'
|
43
|
+
|
44
|
+
media = TMail::Media.parse(IO.readlines("sample-MMS.file").join)
|
45
|
+
mms = MMS2R::Media.create(media,Logger.new(STDOUT))
|
46
|
+
|
47
|
+
# process finds all the media in a MMS, strips advertsing, then
|
48
|
+
# writes the user generated media to disk
|
36
49
|
mms.process
|
37
|
-
|
38
|
-
#
|
39
|
-
#
|
40
|
-
|
41
|
-
mms.media['
|
42
|
-
|
43
|
-
|
44
|
-
|
50
|
+
|
51
|
+
# mms.media is a hash that is indexed by mime-type.
|
52
|
+
# The mime-type key returns an array of filepaths
|
53
|
+
# to media in the MMS that is of that type
|
54
|
+
mms.media['image/jpeg'].each {|f| puts "#{f}"}
|
55
|
+
mms.media['text/plain'].each {|f| puts "#{f}"}
|
56
|
+
|
57
|
+
# print the text (assumes MMS had text)
|
58
|
+
text = IO.readlines(mms.media['text/plain'][0]).join
|
45
59
|
puts text
|
60
|
+
|
61
|
+
# save the image (assumes MMS had a jpeg)
|
62
|
+
FileUtils.cp mms.media['image/jpeg'][0], '/some/where/use/ful', :verbose => true
|
63
|
+
|
64
|
+
puts "does the MMS have video? #{!mms.media['video/quicktime'].nil?}"
|
65
|
+
|
46
66
|
#remove the media that was put to temporary disk
|
47
|
-
|
67
|
+
mms.purge
|
48
68
|
|
49
69
|
== REQUIREMENTS:
|
50
70
|
|
51
|
-
*
|
71
|
+
* RCov
|
52
72
|
* Hpricot
|
53
73
|
|
54
74
|
== INSTALL:
|
data/Rakefile
CHANGED
@@ -13,7 +13,7 @@ Hoe.new('mms2r', MMS2R::Media::VERSION) do |p|
|
|
13
13
|
p.author = 'Mike Mondragon'
|
14
14
|
p.email = 'mike@mondragon.cc'
|
15
15
|
p.summary = 'Extract media from MMS '
|
16
|
-
p.description = p.paragraphs_of('README.txt', 2..
|
16
|
+
p.description = p.paragraphs_of('README.txt', 2..8).join("\n\n")
|
17
17
|
p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
|
18
18
|
p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
|
19
19
|
p.extra_deps << ['hpricot']
|
data/lib/mms2r/media.rb
CHANGED
@@ -10,6 +10,7 @@ require 'mms2r'
|
|
10
10
|
require 'mms2r/version'
|
11
11
|
require 'mms2r/cingular_media'
|
12
12
|
require 'mms2r/mmode_media'
|
13
|
+
require 'mms2r/nextel_media'
|
13
14
|
require 'mms2r/sprint_media'
|
14
15
|
require 'mms2r/tmobile_media'
|
15
16
|
require 'mms2r/verizon_media'
|
@@ -56,10 +57,13 @@ module MMS2R
|
|
56
57
|
|
57
58
|
CARRIER_CLASSES = {
|
58
59
|
'mms.mycingular.com' => MMS2R::CingularMedia,
|
60
|
+
'cingularme.com' => MMS2R::CingularMedia,
|
59
61
|
'mmode.com' => MMS2R::MModeMedia,
|
62
|
+
'messaging.nextel.com' => MMS2R::NextelMedia,
|
60
63
|
'pm.sprint.com' => MMS2R::SprintMedia,
|
61
64
|
'messaging.sprintpcs.com' => MMS2R::SprintMedia,
|
62
65
|
'tmomail.net' => MMS2R::TMobileMedia,
|
66
|
+
'vtext.com' => MMS2R::VerizonMedia,
|
63
67
|
'vzwpix.com' => MMS2R::VerizonMedia
|
64
68
|
}
|
65
69
|
|
@@ -111,30 +115,35 @@ module MMS2R
|
|
111
115
|
# if the part is not base64 encoded.
|
112
116
|
part.base64_decode
|
113
117
|
file = temp_file(part)
|
114
|
-
|
115
|
-
|
118
|
+
if self.class.main_type?(part).eql?('text')
|
119
|
+
type, content = transform_text(part)
|
120
|
+
else
|
121
|
+
type = self.class.part_type?(part)
|
122
|
+
content = part.body
|
123
|
+
end
|
116
124
|
@logger.info("#{self.class} writing file #{file}") unless @logger.nil?
|
117
125
|
File.open(file,'w'){ |f|
|
118
126
|
f.write(content)
|
119
127
|
}
|
120
|
-
type = self.class.part_type?(part)
|
121
128
|
return type, file
|
122
129
|
end
|
123
130
|
|
124
131
|
##
|
125
132
|
# Helper for process_media template method to transform text.
|
126
133
|
|
127
|
-
def transform_text(
|
134
|
+
def transform_text(part)
|
135
|
+
type = self.class.part_type?(part)
|
136
|
+
text = part.body
|
128
137
|
f = "#{self.class.name.downcase.gsub(/::/,'_')}_transform.yml"
|
129
138
|
yf = File.join(self.class.conf_dir(), "#{f}")
|
130
|
-
return text unless File::exist?(yf)
|
139
|
+
return type, text unless File::exist?(yf)
|
131
140
|
h = YAML::load_file(yf)
|
132
141
|
a = h[type]
|
133
|
-
return text if a.nil?
|
142
|
+
return type, text if a.nil?
|
134
143
|
a.each do |from,to|
|
135
144
|
text.gsub!(/#{from}/m,to)
|
136
145
|
end
|
137
|
-
text
|
146
|
+
return type, text
|
138
147
|
end
|
139
148
|
|
140
149
|
##
|
@@ -210,6 +219,14 @@ module MMS2R
|
|
210
219
|
parts = Array.new()
|
211
220
|
parts << @mail
|
212
221
|
end
|
222
|
+
parts.each do |p|
|
223
|
+
if self.class.part_type?(p).eql?('multipart/alternative')
|
224
|
+
part = parts.delete(p)
|
225
|
+
part.parts.each do |mp|
|
226
|
+
parts << mp
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
213
230
|
parts.each do |p|
|
214
231
|
t = self.class.part_type?(p)
|
215
232
|
unless ignore_media?(t,p)
|
data/lib/mms2r/sprint_media.rb
CHANGED
@@ -22,8 +22,7 @@ module MMS2R
|
|
22
22
|
part.base64_decode
|
23
23
|
if self.class.part_type?(part).eql?('text/plain')
|
24
24
|
file_name = filename?(part)
|
25
|
-
type =
|
26
|
-
content = transform_text(type,part.body)
|
25
|
+
type, content = transform_text(part)
|
27
26
|
elsif self.class.part_type?(part).eql?('text/html')
|
28
27
|
doc = Hpricot(part.body)
|
29
28
|
trs = doc.search("/html/body//tr")
|
data/lib/mms2r/version.rb
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
From: 2068675309@cingularme.com
|
2
|
+
To: tommytutone@example.com
|
3
|
+
Subject:
|
4
|
+
X-OPWV-Extra-Message-Type: MO
|
5
|
+
Message-Id: <01234567890123.ABCD4567.foobar01.cingularme.com@cingularme.com>
|
6
|
+
Date: Wed, 7 Feb 2007 00:39:36 -0500
|
7
|
+
|
8
|
+
hello world
|
9
|
+
|
10
|
+
--
|
11
|
+
===============================================
|
12
|
+
Brought to you by, Cingular Wireless Messaging
|
13
|
+
http://www.CingularMe.COM/
|
@@ -0,0 +1,17 @@
|
|
1
|
+
Message-Id: <00000000000002.0123456789@mx.mms.example.com>
|
2
|
+
Mime-Version: 1.0
|
3
|
+
From: 2068675309@mms.example.com
|
4
|
+
To: tommytutone@example.com
|
5
|
+
Subject: text only
|
6
|
+
Date: Thu, 11 Jan 2007 02:28:22 -0500
|
7
|
+
Content-Type: multipart/mixed; boundary="----=_Part_1061064_5544954.1168500502466"
|
8
|
+
|
9
|
+
------=_Part_1061064_5544954.1168500502466
|
10
|
+
Content-Type: text/plain; charset=utf-8
|
11
|
+
Content-Transfer-Encoding: base64
|
12
|
+
Content-Location: hello_world.txt
|
13
|
+
Content-Disposition: inline
|
14
|
+
|
15
|
+
aGVsbG8gd29ybGQ=
|
16
|
+
------=_Part_1061064_5544954.1168500502466--
|
17
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
Message-Id: <0123456.7890123456789.JavaMail.foot@st-09>
|
2
|
+
Date: Sat, 16 Sep 2006 08:05:47 -0600 (GMT-06:00)
|
3
|
+
From: 12068675309@mmode.com
|
4
|
+
To: tommytutone@example.com
|
5
|
+
Subject: Picture(3).jpg
|
6
|
+
Mime-Version: 1.0
|
7
|
+
Content-Type: multipart/mixed;
|
8
|
+
boundary="----=_Part_012345_678901.1231231231239"
|
9
|
+
X-Mms-Delivery-Report: no
|
10
|
+
X-Mms-Delivery-Time: Sat, 16 Sep 2006 08:05:47 -0600 (GMT-06:00)
|
11
|
+
X-Mms-MMS-Version: 1.0
|
12
|
+
X-Mms-Message-Class: Personal
|
13
|
+
X-Mms-Message-Type: m-send-req
|
14
|
+
X-Mms-Message-Size: 33774
|
15
|
+
X-Mms-Read-Reply: no
|
16
|
+
X-Mms-Sender-Visibility: Show
|
17
|
+
X-Mms-Transaction-ID: 3-1fac@mms.mmode.com
|
18
|
+
X-Mms-Message-ID: 12345678@mms.mmode.com
|
19
|
+
X-Priority: 3
|
20
|
+
|
21
|
+
------=_Part_012345_678901.1231231231239
|
22
|
+
Content-Type: image/jpeg; name="picture(3).jpg"
|
23
|
+
Content-Transfer-Encoding: base64
|
24
|
+
Content-ID: <picture(3).jpg>
|
25
|
+
Content-Location: picture(3).jpg
|
26
|
+
Content-Disposition: attachment
|
27
|
+
|
28
|
+
/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAAAAgAAAAAAAD//gAXQ3JlYXRl
|
29
|
+
ZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxER
|
30
|
+
ExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4e
|
31
|
+
Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgAAQAB
|
32
|
+
AwEiAAIRAQMRAf/EABUAAQEAAAAAAAAAAAAAAAAAAAAH/8QAFBABAAAAAAAAAAAAAAAAAAAA
|
33
|
+
AP/EABUBAQEAAAAAAAAAAAAAAAAAAAcI/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQAC
|
34
|
+
EQMRAD8AlgA6WW//2Q==
|
35
|
+
------=_Part_012345_678901.1231231231239--
|
36
|
+
|
@@ -0,0 +1,46 @@
|
|
1
|
+
Content-Type: multipart/related; boundary="01ab23456c78qwerty_0000"; type="multipart/alternative"
|
2
|
+
To: <tommytutone@example.com>
|
3
|
+
Date: Sun, 04 Feb 2007 05:38:37 GMT
|
4
|
+
From: 2068675309@messaging.nextel.com
|
5
|
+
Sender: "2068675309" <2068675309@messaging.nextel.com>
|
6
|
+
X-Priority: 3
|
7
|
+
MIME-Version: 1.0
|
8
|
+
Message-Id: <01234567890123.ABCD4567.fofofo03.messaging.nextel.com@fofozzzz>
|
9
|
+
|
10
|
+
This is a multi-part message in MIME format.
|
11
|
+
|
12
|
+
--01ab23456c78qwerty_0000
|
13
|
+
Content-Type: multipart/alternative; boundary="abcd_0123456789_abcdefg"
|
14
|
+
|
15
|
+
|
16
|
+
--abcd_0123456789_abcdefg
|
17
|
+
Content-Type: text/plain; charset="utf-8"
|
18
|
+
|
19
|
+
This is an MMS message. 2006 Sprint Nextel. All rights reserved.
|
20
|
+
|
21
|
+
--abcd_0123456789_abcdefg
|
22
|
+
Content-Type: text/html; charset="utf-8"
|
23
|
+
|
24
|
+
<html><body>
|
25
|
+
|
26
|
+
<center>This is an MMS message. <br><center> 2006 Sprint Nextel. All rights reserved</center><br><img src="cid:Jan15_0001.jpg.jpg" border="0" alt="Jan15_0001.jpg"><p>
|
27
|
+
<p><br><p>
|
28
|
+
</center>
|
29
|
+
</body></html>
|
30
|
+
|
31
|
+
--abcd_0123456789_abcdefg--
|
32
|
+
|
33
|
+
--01ab23456c78qwerty_0000
|
34
|
+
Content-ID: <Jan15_0001.jpg.jpg>
|
35
|
+
Content-Type: image/jpeg; name="Jan15_0001.jpg"
|
36
|
+
Content-Disposition: inline; filename="Jan15_0001.jpg"
|
37
|
+
Content-Transfer-Encoding: base64
|
38
|
+
|
39
|
+
/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAAAAgAAAAAAAD//gAXQ3JlYXRl
|
40
|
+
ZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxER
|
41
|
+
ExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4e
|
42
|
+
Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgAAQAB
|
43
|
+
AwEiAAIRAQMRAf/EABUAAQEAAAAAAAAAAAAAAAAAAAAH/8QAFBABAAAAAAAAAAAAAAAAAAAA
|
44
|
+
AP/EABUBAQEAAAAAAAAAAAAAAAAAAAcI/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQAC
|
45
|
+
EQMRAD8AlgA6WW//2Q==
|
46
|
+
--01ab23456c78qwerty_0000--
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Mime-Version: 1.0
|
2
|
+
Message-Id: <00000000000001.0123456789@mx.mms.example.com>
|
3
|
+
Date: Sun, 29 Oct 2006 20:40:30 -0800 (PST)
|
4
|
+
To: tommytutone@example.com
|
5
|
+
From: 2068675309@mms.example.com
|
6
|
+
Subject: image test
|
7
|
+
Content-Type: multipart/related; type="multipart/alternative";
|
8
|
+
boundary="----=_Part_1224755_98719.1162204830872"; start="<SMIL.TXT>"
|
9
|
+
X-Mms-Delivery-Report: no
|
10
|
+
|
11
|
+
------=_Part_1224755_98719.1162204830872
|
12
|
+
Content-Type: image/gif; name=spacer.gif
|
13
|
+
Content-Transfer-Encoding: base64
|
14
|
+
Content-Disposition: attachment; filename=spacer.gif
|
15
|
+
Content-ID: <spacer.gif>
|
16
|
+
|
17
|
+
R0lGODlhAQABAIAAAP///wAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==
|
18
|
+
------=_Part_1224755_98719.1162204830872--
|
19
|
+
|