muri 0.0.4 → 0.0.5
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/README.textile +103 -0
- data/VERSION.yml +1 -1
- data/lib/muri/base.rb +17 -19
- data/lib/muri/filters/facebook.rb +68 -0
- data/lib/muri/filters/flickr.rb +20 -9
- data/lib/muri/filters/imageshack.rb +1 -1
- data/lib/muri/filters/photobucket.rb +4 -1
- data/lib/muri/filters/vimeo.rb +15 -8
- data/lib/muri/filters/youtube.rb +29 -9
- data/lib/muri.rb +2 -2
- data/muri.gemspec +11 -8
- data/test/error_test.rb +10 -4
- data/test/facebook_test.rb +62 -0
- data/test/flickr_test.rb +57 -11
- data/test/imageshack_test.rb +24 -8
- data/test/photobucket_test.rb +10 -0
- data/test/vimeo_test.rb +60 -7
- data/test/youtube_test.rb +92 -8
- metadata +10 -7
- data/README.rdoc +0 -56
data/README.textile
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
h2. Media URI Parser - MURI
|
2
|
+
|
3
|
+
A simple to use media URI Parser. Pass a URI in, get helpful information out.
|
4
|
+
|
5
|
+
MURI Currently supports:
|
6
|
+
* Youtube (Single videos and Playlists)
|
7
|
+
** "API documentation":http://code.google.com/apis/youtube/2.0/developers_guide_protocol_audience.html
|
8
|
+
* Vimeo (single videos and albums)
|
9
|
+
** "API documentation":http://vimeo.com/api/docs/simple-api
|
10
|
+
* Flickr (single images and sets)
|
11
|
+
** "API documentation":http://www.flickr.com/services/api/
|
12
|
+
* Imageshack
|
13
|
+
* Photobucket
|
14
|
+
** "API documentation":http://photobucket.com/developer/documentation
|
15
|
+
* Facebook
|
16
|
+
** "API documentation":http://wiki.developers.facebook.com/index.php/API
|
17
|
+
|
18
|
+
h3. Installation & basic usage
|
19
|
+
|
20
|
+
Install muri as a ruby gem (you might need to run this command as root by prepending @sudo@ to it):
|
21
|
+
|
22
|
+
<pre>
|
23
|
+
<code>
|
24
|
+
$ gem install muri
|
25
|
+
</code>
|
26
|
+
</pre>
|
27
|
+
|
28
|
+
Using muri is just as easy!
|
29
|
+
|
30
|
+
<pre>
|
31
|
+
<code>
|
32
|
+
a = Muri.parse('http://www.youtube.com/watch?v=blahblahblah&feature=rec-LGOUT-exp_fresh+div-1r-1-HM')
|
33
|
+
</code>
|
34
|
+
</pre>
|
35
|
+
|
36
|
+
If @a.valid?@ you are good to go. If not, either the URI host was not recognized, or the path/parameters provided along with a known URI host were not recognized. When these two types of errors are encountered, an exception is caught and returned in @a.errors@ as either "Muri::NoParser" or "Muri::UnrecognizedURI". If you don't care about the type of error, just that the URI was not parsed, @a.valid?@ will give you a boolean answer.
|
37
|
+
|
38
|
+
Assuming the URI was successfully parsed (thus @a.valid? == true@), all media types share several common attributes:
|
39
|
+
|
40
|
+
<pre>
|
41
|
+
<code>
|
42
|
+
a.service # 'Youtube'
|
43
|
+
a.media_id # 'blahblahblah'
|
44
|
+
a.original_url # 'http://www.youtube.com/watch?v=blahblahblah&feature=rec-LGOUT-exp_fresh+div-1r-1-HM'
|
45
|
+
a.uri # URI object for 'http://www.youtube.com/watch?v=blahblahblah&feature=rec-LGOUT-exp_fresh+div-1r-1-HM'
|
46
|
+
</code>
|
47
|
+
</pre>
|
48
|
+
|
49
|
+
*Due to variations in information which can be gathered from a uri, some services provide more information than others. For example:*
|
50
|
+
|
51
|
+
* All but Imageshack have a @media_api_id@, which is the ID which can be used in API calls to the related services. Typically the same as @media_id@.
|
52
|
+
|
53
|
+
<pre>
|
54
|
+
<code>
|
55
|
+
a.media_api_id # 'blahblahblah'
|
56
|
+
</code>
|
57
|
+
</pre>
|
58
|
+
|
59
|
+
*NOTE: Facebook photos return a hash for @media_api_id@, keyed with @pid@ (the ID for the photo) and @user_id@ (the ID for the user)*
|
60
|
+
|
61
|
+
* Services with a @media_api_id@ also have a @media_api_type@, which indicates what sort of API call should be made (be it 'photo', 'video', 'media', 'set', 'album', or 'playlist', depending on URI type)
|
62
|
+
|
63
|
+
* A direct media url for Youtube, Photobucket, and Imageshack (@http://img#{num}.imageshack.us/img#{num}/#{NUMBER}/#{IMAGENAME}@ format)
|
64
|
+
|
65
|
+
<pre>
|
66
|
+
<code>
|
67
|
+
a.media_url # 'http://www.youtube.com/v/blahblahblah'
|
68
|
+
</code>
|
69
|
+
</pre>
|
70
|
+
|
71
|
+
* A media landing website url for Youtube, Photobucket, Imageshack, Vimeo, and Flickr (flickr media_url's provide the @http://flic.kr/p/#{ID}@ short url)
|
72
|
+
|
73
|
+
<pre>
|
74
|
+
<code>
|
75
|
+
a.website # 'http://www.youtube.com/watch?v=blahblahblah'
|
76
|
+
</code>
|
77
|
+
</pre>
|
78
|
+
|
79
|
+
* Content type for Imageshack, Photobucket and Flickr URI's (flickr in the @http://farm#{num}.static.flickr.com/@ format)
|
80
|
+
|
81
|
+
<pre>
|
82
|
+
<code>
|
83
|
+
a.content_type # 'jpg' (Content Type also for Imageshack and Photobucket)
|
84
|
+
</code>
|
85
|
+
</pre>
|
86
|
+
|
87
|
+
* Thumbnails URL for Youtube Photobucket, and Flickr (flickr in the @http://farm#{num}.static.flickr.com/@ format)
|
88
|
+
|
89
|
+
<pre>
|
90
|
+
<code>
|
91
|
+
a.media_thumbnail # 'http://i.ytimg.com/vi/4CYDFoEz8rg/default.jpg'
|
92
|
+
</code>
|
93
|
+
</pre>
|
94
|
+
|
95
|
+
*Some additional information may be provided, which can be determined by looking through each filters code.*
|
96
|
+
|
97
|
+
|
98
|
+
If an attribute is not present, muri returns @nil@.
|
99
|
+
|
100
|
+
|
101
|
+
h3. Contact
|
102
|
+
|
103
|
+
If you would like to get in contact with me, my email is bananastalktome@gmail.com. I appreciate any information or assistance reverse-engineering media website URI's. I plan on including more services _and_ more parse information with updates. That being said, MURI is currently not production quality. Please use with caution and in development only. Thank you.
|
data/VERSION.yml
CHANGED
data/lib/muri/base.rb
CHANGED
@@ -15,6 +15,7 @@ class Muri
|
|
15
15
|
include Filter::Vimeo
|
16
16
|
include Filter::Imageshack
|
17
17
|
include Filter::Photobucket
|
18
|
+
include Filter::Facebook
|
18
19
|
|
19
20
|
def self.parse(url)
|
20
21
|
self.new(url)
|
@@ -33,7 +34,7 @@ class Muri
|
|
33
34
|
@info.to_s
|
34
35
|
end
|
35
36
|
|
36
|
-
def
|
37
|
+
def valid?
|
37
38
|
@info[:media_id].nil? ? false : true
|
38
39
|
end
|
39
40
|
|
@@ -50,21 +51,22 @@ class Muri
|
|
50
51
|
private
|
51
52
|
|
52
53
|
def _parse(raw_url)
|
53
|
-
|
54
|
-
if @url.scheme.nil?
|
55
|
-
raw_url = "http://#{raw_url}"
|
54
|
+
begin
|
56
55
|
@url = URI.parse(raw_url)
|
56
|
+
if @url.scheme.nil?
|
57
|
+
raw_url = "http://#{raw_url}"
|
58
|
+
@url = URI.parse(raw_url)
|
59
|
+
end
|
60
|
+
if parser = determine_feed_parser
|
61
|
+
@info[:uri] = @url
|
62
|
+
@info[:original_url] = raw_url
|
63
|
+
send(PARSERS[parser])
|
64
|
+
else
|
65
|
+
raise NoParser
|
66
|
+
end
|
67
|
+
rescue NoParser, UnsupportedURI => e
|
68
|
+
@info[:errors] = "#{e}"
|
57
69
|
end
|
58
|
-
if parser = determine_feed_parser
|
59
|
-
@info[:uri] = @url
|
60
|
-
@info[:original_url] = raw_url
|
61
|
-
send(PARSERS[parser])
|
62
|
-
else
|
63
|
-
raise NoParser.new("No Transformer found for URL")
|
64
|
-
end
|
65
|
-
|
66
|
-
#rescue => e
|
67
|
-
#raise "failed #{e}"
|
68
70
|
end
|
69
71
|
|
70
72
|
def determine_feed_parser
|
@@ -72,11 +74,7 @@ class Muri
|
|
72
74
|
end
|
73
75
|
|
74
76
|
def method_missing(func, args = nil)
|
75
|
-
|
76
|
-
@info[func.to_sym].nil? ? nil : @info[func.to_sym]
|
77
|
-
#else
|
78
|
-
# nil #super(func,args)
|
79
|
-
#end
|
77
|
+
@info[func.to_sym].nil? ? nil : @info[func.to_sym]
|
80
78
|
end
|
81
79
|
|
82
80
|
protected
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
## Best way I have been able to find to use the facebook API to fetch photo information is as follows:
|
3
|
+
## First, get a list of all user photos (using media_id). Parse each resulting <photo> element until you
|
4
|
+
## find one where <link> equals
|
5
|
+
## 'http://www.facebook.com/photo.php?pid=#{media_api_id[:pid]}&id=#{media_api_id[:user_id]}'
|
6
|
+
##
|
7
|
+
## Sucks a whole lot, but facebook seems to no longer allow API calls using the PID from the query string.
|
8
|
+
class Muri
|
9
|
+
module Filter
|
10
|
+
module Facebook
|
11
|
+
|
12
|
+
FACEBOOK_PHOTO = "photo"
|
13
|
+
FACEBOOK_VIDEO = "video"
|
14
|
+
|
15
|
+
def self.included(base)
|
16
|
+
base.class_eval do
|
17
|
+
self::PARSERS[Muri::Filter::Facebook] = "facebook_parse"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def facebook_parse
|
22
|
+
@info[:service] = 'Facebook'
|
23
|
+
params = @url.query.nil? ? {} : CGI::parse(@url.query)
|
24
|
+
url_common = "http://www.facebook.com"
|
25
|
+
|
26
|
+
if @url.path =~ /^\/v\/([0-9]+)/
|
27
|
+
@info[:media_id] = $1
|
28
|
+
@info[:media_url] = "#{url_common}/v/#{@info[:media_id]}"
|
29
|
+
|
30
|
+
# Currently no API for video, but media_id is best guess value for such content
|
31
|
+
@info[:media_api_id] = @info[:media_id]
|
32
|
+
@info[:media_api_type] = FACEBOOK_VIDEO
|
33
|
+
elsif (@url.path =~ /^\/photo\.php/i)
|
34
|
+
if params.include?("pid") && params.include?("id") && params.include?("l")
|
35
|
+
@info[:media_api_type] = FACEBOOK_PHOTO
|
36
|
+
@info[:media_id] = params["pid"].first if (params["pid"].first =~ /([0-9]*)/)
|
37
|
+
media_creator = params["id"].first if (params["id"].first =~ /([0-9]*)/)
|
38
|
+
share_key = params["l"].first
|
39
|
+
|
40
|
+
@info[:website] = "#{url_common}/photo.php?pid=#{@info[:media_id]}&l=#{share_key}&id=#{media_creator}"
|
41
|
+
@info[:media_api_id] = { :pid => @info[:media_id], :user_id => media_creator }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
#if self.valid?
|
46
|
+
#@info[:media_api_id] = @info[:media_id]
|
47
|
+
#else
|
48
|
+
if !self.valid?
|
49
|
+
raise UnsupportedURI
|
50
|
+
end
|
51
|
+
|
52
|
+
self
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.parsable?(uri)
|
56
|
+
uri.host =~ /^(www\.)?facebook\.com$/i
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# http://www.facebook.com/photo.php?pid=34929102&l=a1abf8cd37&id=15201063 (preview)
|
64
|
+
# pid = photo id
|
65
|
+
# id = user id
|
66
|
+
# l = photo share key
|
67
|
+
# http://www.facebook.com/v/614695029223 (full)
|
68
|
+
# http://www.facebook.com/album.php?aid=2149275&id=15201063&l=99900807c3
|
data/lib/muri/filters/flickr.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
class Muri
|
2
2
|
module Filter
|
3
3
|
module Flickr
|
4
|
-
|
4
|
+
|
5
|
+
FLICKR_PHOTO = "photo"
|
6
|
+
FLICKR_SET = "set"
|
7
|
+
|
5
8
|
def self.included(base)
|
6
9
|
base.class_eval do
|
7
10
|
self::PARSERS[Muri::Filter::Flickr] = "flickr_parse"
|
@@ -11,13 +14,15 @@ class Muri
|
|
11
14
|
def flickr_parse
|
12
15
|
@info[:service] = 'Flickr'
|
13
16
|
|
14
|
-
if @url.path =~ /^\/photos\/([a-z0-9\@]*?)\/(
|
15
|
-
|
16
|
-
@info[:media_id] = $
|
17
|
+
if @url.path =~ /^\/photos\/([a-z0-9\-\_\@]*?)\/(sets\/)?([0-9]*)/i
|
18
|
+
media_creator = $1
|
19
|
+
@info[:media_id] = $3
|
20
|
+
@info[:media_api_type] = $2.nil? ? FLICKR_PHOTO : FLICKR_SET
|
17
21
|
elsif (@url.host + @url.path) =~ /^farm([1-3])\.static.flickr.com\/([0-9]*?)\/([0-9]*?)\_([a-z0-9]*?)(\_[a-z]){0,1}\.([a-z]*)/i
|
18
22
|
farm = $1
|
19
23
|
server_id = $2
|
20
24
|
@info[:media_id] = $3
|
25
|
+
@info[:media_api_type] = FLICKR_PHOTO
|
21
26
|
media_secret = $4
|
22
27
|
# if !$5.nil?
|
23
28
|
# @info[:media_size] = case $5.downcase
|
@@ -32,20 +37,25 @@ class Muri
|
|
32
37
|
@info[:media_thumbnail] = "http://farm#{farm}.static.flickr.com/#{server_id}/#{@info[:media_id]}_#{media_secret}_t.jpg"
|
33
38
|
elsif (@url.host + @url.path) =~ /^flic\.kr\/p\/([a-z0-9]*)/i
|
34
39
|
@info[:media_id] = self.class.decode58($1)
|
40
|
+
@info[:media_api_type] = FLICKR_PHOTO
|
35
41
|
end
|
36
42
|
|
37
|
-
if self.
|
43
|
+
if self.valid?
|
38
44
|
@info[:media_api_id] = @info[:media_id]
|
39
|
-
@info[:
|
45
|
+
if @info[:media_api_type] == FLICKR_PHOTO
|
46
|
+
@info[:website] = "http://flic.kr/p/" + self.class.encode58(@info[:media_id].to_i)
|
47
|
+
elsif @info[:media_api_type] == FLICKR_SET
|
48
|
+
@info[:website] = "http://www.flickr.com/photos/#{media_creator}/sets/#{@info[:media_id]}"
|
49
|
+
end
|
40
50
|
else
|
41
|
-
raise UnsupportedURI
|
51
|
+
raise UnsupportedURI
|
42
52
|
end
|
43
53
|
|
44
54
|
self
|
45
55
|
end
|
46
56
|
|
47
57
|
def self.parsable?(uri)
|
48
|
-
uri.host =~ /^(www
|
58
|
+
uri.host =~ /^(www\.)?(flic\.kr|(farm[0-9]\.static\.|)(flickr)\.com)/i
|
49
59
|
end
|
50
60
|
|
51
61
|
|
@@ -60,4 +70,5 @@ end
|
|
60
70
|
# photo-id: 2088436532
|
61
71
|
# secret: ee07b4474e
|
62
72
|
# size: m
|
63
|
-
# * add _d before .jpg in url to create a download URL
|
73
|
+
# * add _d before .jpg in url to create a download URL
|
74
|
+
# http://www.flickr.com/photos/bananastalktome/sets/72157623467777820/ (set preview)
|
@@ -26,7 +26,7 @@ class Muri
|
|
26
26
|
end
|
27
27
|
|
28
28
|
# imageshack does not currently have API for retrieving individual video information
|
29
|
-
if self.
|
29
|
+
if self.valid?
|
30
30
|
@info[:website] = "#{url_common}/i/#{@info[:media_id]}.#{@info[:content_type]}/"
|
31
31
|
else
|
32
32
|
raise UnsupportedURI
|
@@ -2,6 +2,8 @@ class Muri
|
|
2
2
|
module Filter
|
3
3
|
module Photobucket
|
4
4
|
|
5
|
+
PHOTOBUCKET_MEDIA = "media"
|
6
|
+
|
5
7
|
def self.included(base)
|
6
8
|
base.class_eval do
|
7
9
|
self::PARSERS[Muri::Filter::Photobucket] = "photobucket_parse"
|
@@ -37,7 +39,8 @@ class Muri
|
|
37
39
|
@info[:website] = "http://gs#{url_common}/?action=view¤t=#{@info[:media_id]}.#{@info[:content_type]}"
|
38
40
|
end
|
39
41
|
|
40
|
-
if self.
|
42
|
+
if self.valid?
|
43
|
+
@info[:media_api_type] = PHOTOBUCKET_MEDIA
|
41
44
|
@info[:media_api_id] = @info[:media_url]
|
42
45
|
@info[:media_thumbnail] = "http://mobth#{direct_url_suffix}"
|
43
46
|
else
|
data/lib/muri/filters/vimeo.rb
CHANGED
@@ -2,7 +2,10 @@ require 'cgi'
|
|
2
2
|
class Muri
|
3
3
|
module Filter
|
4
4
|
module Vimeo
|
5
|
-
|
5
|
+
|
6
|
+
VIMEO_VIDEO = "video"
|
7
|
+
VIMEO_ALBUM = "album"
|
8
|
+
|
6
9
|
def self.included(base)
|
7
10
|
base.class_eval do
|
8
11
|
self::PARSERS[Muri::Filter::Vimeo] = "vimeo_parse"
|
@@ -11,17 +14,20 @@ class Muri
|
|
11
14
|
|
12
15
|
def vimeo_parse
|
13
16
|
@info[:service] = 'Vimeo'
|
14
|
-
params = CGI::parse(@url.query)
|
15
|
-
|
16
|
-
if @url.path =~ /^\/([0-9]+)
|
17
|
-
@info[:media_id] = $
|
17
|
+
params = @url.query.nil? ? {} : CGI::parse(@url.query)
|
18
|
+
|
19
|
+
if @url.path =~ /^\/(album\/)?([0-9]+)(\/)?$/i
|
20
|
+
@info[:media_id] = $2
|
21
|
+
@info[:media_api_type] = $1.nil? ? VIMEO_VIDEO : VIMEO_ALBUM
|
18
22
|
elsif ((@url.path =~ /^\/moogaloop\.swf/i) && (params.include?("clip_id")))
|
19
23
|
@info[:media_id] = params["clip_id"].first if (params["clip_id"].first =~ /([0-9]*)/)
|
24
|
+
@info[:media_api_type] = VIMEO_VIDEO
|
20
25
|
end
|
21
26
|
|
22
|
-
if self.
|
27
|
+
if self.valid?
|
23
28
|
@info[:media_api_id] = @info[:media_id]
|
24
|
-
@info[:
|
29
|
+
album = (@info[:media_api_type] == VIMEO_ALBUM) ? "album/" : ""
|
30
|
+
@info[:website] = "http://vimeo.com/#{album}#{@info[:media_id]}"
|
25
31
|
else
|
26
32
|
raise UnsupportedURI
|
27
33
|
end
|
@@ -37,4 +43,5 @@ class Muri
|
|
37
43
|
end
|
38
44
|
end
|
39
45
|
# http://vimeo.com/moogaloop.swf?clip_id=7312128&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1"
|
40
|
-
# http://vimeo.com/7312128
|
46
|
+
# http://vimeo.com/7312128
|
47
|
+
# http://vimeo.com/album/89702
|
data/lib/muri/filters/youtube.rb
CHANGED
@@ -3,6 +3,9 @@ class Muri
|
|
3
3
|
module Filter
|
4
4
|
module Youtube
|
5
5
|
|
6
|
+
YOUTUBE_VIDEO = "video"
|
7
|
+
YOUTUBE_PLAYLIST = "playlist"
|
8
|
+
|
6
9
|
def self.included(base)
|
7
10
|
base.class_eval do
|
8
11
|
self::PARSERS[Muri::Filter::Youtube] = "youtube_parse"
|
@@ -12,30 +15,47 @@ class Muri
|
|
12
15
|
def youtube_parse
|
13
16
|
@info[:service] = 'Youtube'
|
14
17
|
url_common = "http://www.youtube.com"
|
18
|
+
params = @url.query.nil? ? {} : CGI::parse(@url.query)
|
15
19
|
|
16
|
-
if (@url.path
|
17
|
-
params = CGI::parse(@url.query)
|
20
|
+
if (@url.path =~ /\/watch$/i) && params.include?("v")
|
18
21
|
@info[:media_id] = params["v"].first
|
22
|
+
@info[:media_api_type] = YOUTUBE_VIDEO
|
19
23
|
elsif (@url.path =~ /\/v\/([a-z0-9\-\_]*)/i)
|
20
24
|
@info[:media_id] = $1
|
25
|
+
@info[:media_api_type] = YOUTUBE_VIDEO
|
26
|
+
elsif (@url.path =~ /\/p\/([a-z0-9\-\_]*)/i)
|
27
|
+
@info[:media_id] = $1
|
28
|
+
@info[:media_api_type] = YOUTUBE_PLAYLIST
|
29
|
+
elsif (@url.path =~ /^\/view\_play\_list/i) && (params.include?('p'))
|
30
|
+
@info[:media_id] = params['p'].first
|
31
|
+
@info[:media_api_type] = YOUTUBE_PLAYLIST
|
21
32
|
end
|
22
33
|
|
23
|
-
if self.
|
24
|
-
@info[:
|
25
|
-
|
34
|
+
if self.valid?
|
35
|
+
if @info[:media_api_type] == YOUTUBE_VIDEO
|
36
|
+
@info[:website] = "#{url_common}/watch?v=#{@info[:media_id]}"
|
37
|
+
@info[:media_url] = "#{url_common}/v/#{@info[:media_id]}"
|
38
|
+
@info[:media_thumbnail] = "http://i.ytimg.com/vi/#{@info[:media_id]}/default.jpg"
|
39
|
+
elsif @info[:media_api_type] == YOUTUBE_PLAYLIST
|
40
|
+
@info[:website] = "#{url_common}/view_play_list?p=#{@info[:media_id]}"
|
41
|
+
@info[:media_url] = "#{url_common}/p/#{@info[:media_id]}"
|
42
|
+
end
|
26
43
|
@info[:media_api_id] = @info[:media_id]
|
27
|
-
@info[:media_thumbnail] = "http://i.ytimg.com/vi/#{@info[:media_id]}/default.jpg"
|
28
44
|
else
|
29
|
-
raise UnsupportedURI
|
45
|
+
raise UnsupportedURI
|
30
46
|
end
|
31
47
|
|
32
48
|
self
|
33
49
|
end
|
34
50
|
def self.parsable?(uri)
|
35
|
-
uri.host =~ /^(www
|
51
|
+
uri.host =~ /^(www\.)?youtube\.com$/i
|
36
52
|
end
|
37
53
|
end
|
38
54
|
end
|
39
55
|
end
|
40
56
|
# http://www.youtube.com/v/4CYDFoEz8rg&hl=en_US&fs=1& (direct)
|
41
|
-
# http://www.youtube.com/watch?v=l983Uob0Seo&feature=rec-LGOUT-exp_fresh+div-1r-1-HM (preview)
|
57
|
+
# http://www.youtube.com/watch?v=l983Uob0Seo&feature=rec-LGOUT-exp_fresh+div-1r-1-HM (preview)
|
58
|
+
|
59
|
+
# PLAYLISTS
|
60
|
+
# http://www.youtube.com/p/57633EC69B4A10A2&hl=en_US&fs=1 (direct)
|
61
|
+
# http://www.youtube.com/view_play_list?p=57633EC69B4A10A2 (preview)
|
data/lib/muri.rb
CHANGED
data/muri.gemspec
CHANGED
@@ -5,24 +5,25 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{muri}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["William Schneider"]
|
12
|
-
s.date = %q{2010-03-
|
12
|
+
s.date = %q{2010-03-05}
|
13
13
|
s.description = %q{Automatically get media information from the URL.}
|
14
14
|
s.email = %q{bananastalktome@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
|
-
"README.
|
16
|
+
"README.textile"
|
17
17
|
]
|
18
18
|
s.files = [
|
19
19
|
".gitignore",
|
20
|
-
"README.
|
20
|
+
"README.textile",
|
21
21
|
"Rakefile",
|
22
22
|
"VERSION.yml",
|
23
23
|
"lib/muri.rb",
|
24
24
|
"lib/muri/base.rb",
|
25
25
|
"lib/muri/filter.rb",
|
26
|
+
"lib/muri/filters/facebook.rb",
|
26
27
|
"lib/muri/filters/flickr.rb",
|
27
28
|
"lib/muri/filters/imageshack.rb",
|
28
29
|
"lib/muri/filters/photobucket.rb",
|
@@ -30,6 +31,7 @@ Gem::Specification.new do |s|
|
|
30
31
|
"lib/muri/filters/youtube.rb",
|
31
32
|
"muri.gemspec",
|
32
33
|
"test/error_test.rb",
|
34
|
+
"test/facebook_test.rb",
|
33
35
|
"test/flickr_test.rb",
|
34
36
|
"test/imageshack_test.rb",
|
35
37
|
"test/photobucket_test.rb",
|
@@ -42,11 +44,12 @@ Gem::Specification.new do |s|
|
|
42
44
|
s.rubygems_version = %q{1.3.5}
|
43
45
|
s.summary = %q{Media URI Parser}
|
44
46
|
s.test_files = [
|
45
|
-
"test/
|
46
|
-
"test/
|
47
|
-
"test/imageshack_test.rb",
|
48
|
-
"test/error_test.rb",
|
47
|
+
"test/error_test.rb",
|
48
|
+
"test/facebook_test.rb",
|
49
49
|
"test/flickr_test.rb",
|
50
|
+
"test/imageshack_test.rb",
|
51
|
+
"test/photobucket_test.rb",
|
52
|
+
"test/vimeo_test.rb",
|
50
53
|
"test/youtube_test.rb"
|
51
54
|
]
|
52
55
|
|
data/test/error_test.rb
CHANGED
@@ -13,14 +13,20 @@ describe "Parse Errors" do
|
|
13
13
|
"http://vimeo.com/moogaloop.swf?server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1"]
|
14
14
|
|
15
15
|
@no_parser.each do |a|
|
16
|
-
it "#{a} should
|
17
|
-
lambda { Muri.parse a }.should raise_exception(Muri::NoParser)
|
16
|
+
it "#{a} should return NoParser" do
|
17
|
+
#lambda { Muri.parse a }.should raise_exception(Muri::NoParser)
|
18
|
+
m = Muri.parse a
|
19
|
+
m.valid? == false
|
20
|
+
m.errors == "Muri::NoParser"
|
18
21
|
end
|
19
22
|
end
|
20
23
|
|
21
24
|
@unsupported.each do |b|
|
22
|
-
it "#{b} should
|
23
|
-
lambda { Muri.parse b }.should raise_exception(Muri::UnsupportedURI)
|
25
|
+
it "#{b} should return UnsupportedURI" do
|
26
|
+
#lambda { Muri.parse b }.should raise_exception(Muri::UnsupportedURI)
|
27
|
+
m = Muri.parse b
|
28
|
+
m.valid? == false
|
29
|
+
m.errors == "Muri::UnsupportedURI"
|
24
30
|
end
|
25
31
|
end
|
26
32
|
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'lib/muri.rb'
|
2
|
+
|
3
|
+
shared_examples_for "Facebook parse" do
|
4
|
+
it "should be Facebook service" do
|
5
|
+
@a.service == 'Facebook'
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should be valid" do
|
9
|
+
@a.valid? == true
|
10
|
+
end
|
11
|
+
end
|
12
|
+
shared_examples_for "Facebook parse photo" do
|
13
|
+
it_should_behave_like "Facebook parse"
|
14
|
+
it "should have media api type = FACEBOOK_PHOTO" do
|
15
|
+
@a.media_api_type == Muri::FACEBOOK_PHOTO
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
shared_examples_for "Facebook parse video" do
|
20
|
+
it_should_behave_like "Facebook parse"
|
21
|
+
it "should have media api type = FACEBOOK_VIDEO" do
|
22
|
+
@a.media_api_type == Muri::FACEBOOK_VIDEO
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "Facebook parse first" do
|
27
|
+
before(:all) do
|
28
|
+
@a = Muri.parse 'http://www.facebook.com/v/614695029223'
|
29
|
+
end
|
30
|
+
it_should_behave_like "Facebook parse video"
|
31
|
+
|
32
|
+
it "should have media id" do
|
33
|
+
@a.media_id == '614695029223'
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should have a media_url" do
|
37
|
+
@a.website == 'http://www.facebook.com/v/614695029223'
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should have media api id" do
|
41
|
+
@a.media_api_id == '614695029223'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "Facebook parse second" do
|
46
|
+
before(:all) do
|
47
|
+
@a = Muri.parse 'http://www.facebook.com/photo.php?pid=34929102&l=a1abf8cd37&id=15201063'
|
48
|
+
end
|
49
|
+
it_should_behave_like "Facebook parse photo"
|
50
|
+
|
51
|
+
it "should have media id" do
|
52
|
+
@a.media_id == '34929102'
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should have a website" do
|
56
|
+
@a.website == 'http://www.facebook.com/photo.php?pid=34929102&l=a1abf8cd37&id=15201063'
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should have media api id" do
|
60
|
+
@a.media_api_id == { :pid => '34929102', :user_id => '15201063' }
|
61
|
+
end
|
62
|
+
end
|
data/test/flickr_test.rb
CHANGED
@@ -1,10 +1,32 @@
|
|
1
1
|
require 'lib/muri.rb'
|
2
|
-
|
3
2
|
shared_examples_for "Flickr parse" do
|
4
3
|
it "should be Flickr service" do
|
5
4
|
@a.service == 'Flickr'
|
6
5
|
end
|
7
|
-
|
6
|
+
it "should be valid" do
|
7
|
+
@a.valid? == true
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
shared_examples_for "Flickr parse photo" do
|
12
|
+
it_should_behave_like "Flickr parse"
|
13
|
+
it "should have media api type = FLICKR_PHOTO" do
|
14
|
+
@a.media_api_type == Muri::FLICKR_PHOTO
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
shared_examples_for "Flickr parse set" do
|
19
|
+
it_should_behave_like "Flickr parse"
|
20
|
+
it "should have media api type = FLICKR_SET" do
|
21
|
+
@a.media_api_type == Muri::FLICKR_SET
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "Flickr parse first" do
|
26
|
+
before(:all) do
|
27
|
+
@a = Muri.parse 'http://www.flickr.com/photos/bananastalktome/2088436532/'
|
28
|
+
end
|
29
|
+
it_should_behave_like "Flickr parse photo"
|
8
30
|
it "should have media id" do
|
9
31
|
@a.media_id == '2088436532'
|
10
32
|
end
|
@@ -15,21 +37,45 @@ shared_examples_for "Flickr parse" do
|
|
15
37
|
|
16
38
|
it "should have media api id" do
|
17
39
|
@a.media_api_id == '2088436532'
|
18
|
-
end
|
19
|
-
end
|
20
|
-
describe "Flickr parse first" do
|
21
|
-
before(:all) do
|
22
|
-
@a = Muri.parse 'http://www.flickr.com/photos/bananastalktome/2088436532/'
|
23
|
-
end
|
24
|
-
it_should_behave_like "Flickr parse"
|
40
|
+
end
|
25
41
|
end
|
26
42
|
describe "Flickr parse second" do
|
27
43
|
before(:all) do
|
28
44
|
@a = Muri.parse 'http://farm3.static.flickr.com/2178/2088436532_ee07b4474e_m.jpg'
|
29
45
|
end
|
30
|
-
it_should_behave_like "Flickr parse"
|
46
|
+
it_should_behave_like "Flickr parse photo"
|
47
|
+
it "should have media id" do
|
48
|
+
@a.media_id == '2088436532'
|
49
|
+
end
|
31
50
|
|
51
|
+
it "should have a website" do
|
52
|
+
@a.website == 'http://flic.kr/p/4bxMqq'
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should have media api id" do
|
56
|
+
@a.media_api_id == '2088436532'
|
57
|
+
end
|
32
58
|
it "should have media thumbnail" do
|
33
59
|
@a.media_thumbnail == 'http://farm3.static.flickr.com/2178/2088436532_ee07b4474e_t.jpg'
|
34
60
|
end
|
35
|
-
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "Flickr parse set first" do
|
64
|
+
before(:all) do
|
65
|
+
@a = Muri.parse 'http://www.flickr.com/photos/bananastalktome/sets/72157623467777820/'
|
66
|
+
end
|
67
|
+
it_should_behave_like "Flickr parse set"
|
68
|
+
|
69
|
+
it "should have media id" do
|
70
|
+
@a.media_id == '72157623467777820'
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should have a website" do
|
74
|
+
@a.website == 'http://www.flickr.com/photos/bananastalktome/sets/72157623467777820'
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should have media api id" do
|
78
|
+
@a.media_api_id == '72157623467777820'
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
data/test/imageshack_test.rb
CHANGED
@@ -4,24 +4,28 @@ shared_examples_for "Imageshack parse" do
|
|
4
4
|
it "should be Imageshack service" do
|
5
5
|
@a.service == 'Imageshack'
|
6
6
|
end
|
7
|
+
it "should be valid" do
|
8
|
+
@a.valid? == true
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "Imageshack parse first" do
|
13
|
+
before(:all) do
|
14
|
+
@a = Muri.parse 'http://img178.imageshack.us/i/dsc01576lo7.jpg/'
|
15
|
+
end
|
16
|
+
it_should_behave_like "Imageshack parse"
|
7
17
|
|
8
18
|
it "should have media id" do
|
9
19
|
@a.media_id == 'dsc01576lo7'
|
10
20
|
end
|
11
21
|
|
12
|
-
it "should have
|
22
|
+
it "should have website" do
|
13
23
|
@a.website == 'http://img178.imageshack.us/i/dsc01576lo7.jpg/'
|
14
24
|
end
|
15
25
|
|
16
26
|
it "should have content_type" do
|
17
27
|
@a.content_type == 'jpg'
|
18
|
-
end
|
19
|
-
end
|
20
|
-
describe "Imageshack parse first" do
|
21
|
-
before(:all) do
|
22
|
-
@a = Muri.parse 'http://img178.imageshack.us/i/dsc01576lo7.jpg/'
|
23
|
-
end
|
24
|
-
it_should_behave_like "Imageshack parse"
|
28
|
+
end
|
25
29
|
end
|
26
30
|
describe "Imageshack parse second" do
|
27
31
|
before(:all) do
|
@@ -29,6 +33,18 @@ describe "Imageshack parse second" do
|
|
29
33
|
end
|
30
34
|
it_should_behave_like "Imageshack parse"
|
31
35
|
|
36
|
+
it "should have media id" do
|
37
|
+
@a.media_id == 'dsc01576lo7'
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should have website" do
|
41
|
+
@a.website == 'http://img178.imageshack.us/i/dsc01576lo7.jpg/'
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should have content_type" do
|
45
|
+
@a.content_type == 'jpg'
|
46
|
+
end
|
47
|
+
|
32
48
|
it "should have website" do
|
33
49
|
@a.media_url == 'http://img178.imageshack.us/img178/773/dsc01576lo7.jpg'
|
34
50
|
end
|
data/test/photobucket_test.rb
CHANGED
@@ -4,7 +4,16 @@ shared_examples_for "Photobucket parse" do
|
|
4
4
|
it "should be Photobucket service" do
|
5
5
|
@a.service == 'Photobucket'
|
6
6
|
end
|
7
|
+
|
8
|
+
it "should be valid" do
|
9
|
+
@a.valid? == true
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should have media api type = PHOTOBUCKET_MEDIA" do
|
13
|
+
@a.api_media_type == Muri::PHOTOBUCKET_MEDIA
|
14
|
+
end
|
7
15
|
end
|
16
|
+
|
8
17
|
describe "Photobucket parse first" do
|
9
18
|
before(:all) do
|
10
19
|
@a = Muri.parse 'http://i244.photobucket.com/albums/gg17/pbapi/file.jpg'
|
@@ -35,6 +44,7 @@ describe "Photobucket parse first" do
|
|
35
44
|
@a.media_thumbnail == 'http://mobth244.photobucket.com/albums/gg17/pbapi/file.jpg'
|
36
45
|
end
|
37
46
|
end
|
47
|
+
|
38
48
|
describe "Photobucket parse second" do
|
39
49
|
before(:all) do
|
40
50
|
@a = Muri.parse 'http://gi0006.photobucket.com/groups/0006/G5PAK3TBQS/DSCF0015-1-1.jpg'
|
data/test/vimeo_test.rb
CHANGED
@@ -5,6 +5,33 @@ shared_examples_for "Vimeo parse" do
|
|
5
5
|
@a.service == 'Vimeo'
|
6
6
|
end
|
7
7
|
|
8
|
+
it "should be valid" do
|
9
|
+
@a.valid? == true
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
shared_examples_for "Vimeo parse video" do
|
15
|
+
it_should_behave_like "Vimeo parse"
|
16
|
+
|
17
|
+
it "should have media api type = VIMEO_VIDEO" do
|
18
|
+
@a.media_api_type == Muri::VIMEO_VIDEO
|
19
|
+
end
|
20
|
+
end
|
21
|
+
shared_examples_for "Vimeo parse album" do
|
22
|
+
it_should_behave_like "Vimeo parse"
|
23
|
+
|
24
|
+
it "should have media api type = VIMEO_ALBUM" do
|
25
|
+
@a.media_api_type == Muri::VIMEO_ALBUM
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "Vimeo parse first" do
|
30
|
+
before(:all) do
|
31
|
+
@a = Muri.parse 'http://vimeo.com/moogaloop.swf?clip_id=7312128&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1'
|
32
|
+
end
|
33
|
+
it_should_behave_like "Vimeo parse video"
|
34
|
+
|
8
35
|
it "should have media id" do
|
9
36
|
@a.media_id == '7312128'
|
10
37
|
end
|
@@ -17,15 +44,41 @@ shared_examples_for "Vimeo parse" do
|
|
17
44
|
@a.media_api_id == '7312128'
|
18
45
|
end
|
19
46
|
end
|
20
|
-
|
47
|
+
|
48
|
+
describe "Vimeo parse second" do
|
21
49
|
before(:all) do
|
22
|
-
@a = Muri.parse 'http://vimeo.com/
|
50
|
+
@a = Muri.parse 'http://vimeo.com/7312128'
|
51
|
+
end
|
52
|
+
it_should_behave_like "Vimeo parse video"
|
53
|
+
|
54
|
+
it "should have media id" do
|
55
|
+
@a.media_id == '7312128'
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should have a website" do
|
59
|
+
@a.website == 'http://vimeo.com/7312128'
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should have media api id" do
|
63
|
+
@a.media_api_id == '7312128'
|
23
64
|
end
|
24
|
-
it_should_behave_like "Vimeo parse"
|
25
65
|
end
|
26
|
-
|
66
|
+
|
67
|
+
describe "Vimeo parse album first" do
|
27
68
|
before(:all) do
|
28
|
-
@a = Muri.parse 'http://vimeo.com/
|
69
|
+
@a = Muri.parse 'http://vimeo.com/album/89702'
|
29
70
|
end
|
30
|
-
it_should_behave_like "Vimeo parse"
|
31
|
-
|
71
|
+
it_should_behave_like "Vimeo parse album"
|
72
|
+
|
73
|
+
it "should have media id" do
|
74
|
+
@a.media_id == '89702'
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should have a website" do
|
78
|
+
@a.website == 'http://vimeo.com/album/89702'
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should have media api id" do
|
82
|
+
@a.media_api_id == '89702'
|
83
|
+
end
|
84
|
+
end
|
data/test/youtube_test.rb
CHANGED
@@ -1,10 +1,36 @@
|
|
1
1
|
require 'lib/muri.rb'
|
2
|
-
|
3
2
|
shared_examples_for "Youtube parse" do
|
4
3
|
it "should be Youtube service" do
|
5
4
|
@a.service == 'Youtube'
|
6
5
|
end
|
7
6
|
|
7
|
+
it "should be valid" do
|
8
|
+
@a.valid? == true
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
shared_examples_for "Youtube parse single" do
|
13
|
+
it_should_behave_like "Youtube parse"
|
14
|
+
|
15
|
+
it "should have media api type = YOUTUBE_VIDEO" do
|
16
|
+
@a.media_api_type == Muri::YOUTUBE_VIDEO
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
shared_examples_for "Youtube parse playlist" do
|
21
|
+
it_should_behave_like "Youtube parse"
|
22
|
+
|
23
|
+
it "should have media api type = YOUTUBE_PLAYLIST" do
|
24
|
+
@a.media_api_type == Muri::YOUTUBE_PLAYLIST
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "Youtube parse first" do
|
29
|
+
before(:all) do
|
30
|
+
@a = Muri.parse 'http://www.youtube.com/v/4CYDFoEz8rg&hl=en_US&fs=1&'
|
31
|
+
end
|
32
|
+
it_should_behave_like "Youtube parse single"
|
33
|
+
|
8
34
|
it "should have media id" do
|
9
35
|
@a.media_id == '4CYDFoEz8rg'
|
10
36
|
end
|
@@ -23,17 +49,75 @@ shared_examples_for "Youtube parse" do
|
|
23
49
|
|
24
50
|
it "should have thumbnail" do
|
25
51
|
@a.media_thumbnail == 'http://i.ytimg.com/vi/4CYDFoEz8rg/default.jpg'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
describe "Youtube parse second" do
|
55
|
+
before(:all) do
|
56
|
+
@a = Muri.parse 'http://www.youtube.com/watch?v=4CYDFoEz8rg'
|
57
|
+
end
|
58
|
+
it_should_behave_like "Youtube parse single"
|
59
|
+
|
60
|
+
it "should have media id" do
|
61
|
+
@a.media_id == '4CYDFoEz8rg'
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should have media api id" do
|
65
|
+
@a.media_api_id == '4CYDFoEz8rg'
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should have media url" do
|
69
|
+
@a.website == 'http://www.youtube.com/watch?v=4CYDFoEz8rg'
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should have website" do
|
73
|
+
@a.media_url == 'http://www.youtube.com/v/4CYDFoEz8rg'
|
26
74
|
end
|
75
|
+
|
76
|
+
it "should have thumbnail" do
|
77
|
+
@a.media_thumbnail == 'http://i.ytimg.com/vi/4CYDFoEz8rg/default.jpg'
|
78
|
+
end
|
27
79
|
end
|
28
|
-
|
80
|
+
|
81
|
+
describe "Youtube parse playlist first" do
|
29
82
|
before(:all) do
|
30
|
-
@a = Muri.parse 'http://www.youtube.com/
|
83
|
+
@a = Muri.parse 'http://www.youtube.com/p/57633EC69B4A10A2&hl=en_US&fs=1'
|
31
84
|
end
|
32
|
-
it_should_behave_like "Youtube parse"
|
85
|
+
it_should_behave_like "Youtube parse playlist"
|
86
|
+
it "should have media id" do
|
87
|
+
@a.media_id == '57633EC69B4A10A2'
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should have media api id" do
|
91
|
+
@a.media_api_id == '57633EC69B4A10A2'
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should have media url" do
|
95
|
+
@a.website == 'http://www.youtube.com/view_play_list?p=57633EC69B4A10A2'
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should have website" do
|
99
|
+
@a.media_url == 'http://www.youtube.com/p/57633EC69B4A10A2'
|
100
|
+
end
|
33
101
|
end
|
34
|
-
|
102
|
+
|
103
|
+
describe "Youtube parse playlist second" do
|
35
104
|
before(:all) do
|
36
|
-
@a = Muri.parse 'http://www.youtube.com/
|
105
|
+
@a = Muri.parse 'http://www.youtube.com/view_play_list?p=57633EC69B4A10A2'
|
37
106
|
end
|
38
|
-
it_should_behave_like "Youtube parse"
|
39
|
-
|
107
|
+
it_should_behave_like "Youtube parse playlist"
|
108
|
+
it "should have media id" do
|
109
|
+
@a.media_id == '57633EC69B4A10A2'
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should have media api id" do
|
113
|
+
@a.media_api_id == '57633EC69B4A10A2'
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should have media url" do
|
117
|
+
@a.website == 'http://www.youtube.com/view_play_list?p=57633EC69B4A10A2'
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should have website" do
|
121
|
+
@a.media_url == 'http://www.youtube.com/p/57633EC69B4A10A2'
|
122
|
+
end
|
123
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: muri
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- William Schneider
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-03-
|
12
|
+
date: 2010-03-05 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -20,15 +20,16 @@ executables: []
|
|
20
20
|
extensions: []
|
21
21
|
|
22
22
|
extra_rdoc_files:
|
23
|
-
- README.
|
23
|
+
- README.textile
|
24
24
|
files:
|
25
25
|
- .gitignore
|
26
|
-
- README.
|
26
|
+
- README.textile
|
27
27
|
- Rakefile
|
28
28
|
- VERSION.yml
|
29
29
|
- lib/muri.rb
|
30
30
|
- lib/muri/base.rb
|
31
31
|
- lib/muri/filter.rb
|
32
|
+
- lib/muri/filters/facebook.rb
|
32
33
|
- lib/muri/filters/flickr.rb
|
33
34
|
- lib/muri/filters/imageshack.rb
|
34
35
|
- lib/muri/filters/photobucket.rb
|
@@ -36,6 +37,7 @@ files:
|
|
36
37
|
- lib/muri/filters/youtube.rb
|
37
38
|
- muri.gemspec
|
38
39
|
- test/error_test.rb
|
40
|
+
- test/facebook_test.rb
|
39
41
|
- test/flickr_test.rb
|
40
42
|
- test/imageshack_test.rb
|
41
43
|
- test/photobucket_test.rb
|
@@ -70,9 +72,10 @@ signing_key:
|
|
70
72
|
specification_version: 3
|
71
73
|
summary: Media URI Parser
|
72
74
|
test_files:
|
73
|
-
- test/photobucket_test.rb
|
74
|
-
- test/vimeo_test.rb
|
75
|
-
- test/imageshack_test.rb
|
76
75
|
- test/error_test.rb
|
76
|
+
- test/facebook_test.rb
|
77
77
|
- test/flickr_test.rb
|
78
|
+
- test/imageshack_test.rb
|
79
|
+
- test/photobucket_test.rb
|
80
|
+
- test/vimeo_test.rb
|
78
81
|
- test/youtube_test.rb
|
data/README.rdoc
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
= Media URI Parser - MURI
|
2
|
-
|
3
|
-
A simple to use media URI Parser. Pass a URI in, get helpful information out.
|
4
|
-
|
5
|
-
MURI Currently supports:
|
6
|
-
* Youtube
|
7
|
-
* Vimeo
|
8
|
-
* Flickr
|
9
|
-
* Imageshack
|
10
|
-
* Photobucket
|
11
|
-
|
12
|
-
== Installation & basic usage
|
13
|
-
|
14
|
-
Install muri as a ruby gem (you might need to run this command as root by prepending +sudo+ to it):
|
15
|
-
|
16
|
-
$ gem install muri
|
17
|
-
|
18
|
-
Using muri is just as easy!
|
19
|
-
|
20
|
-
a = Muri.parse('http://www.youtube.com/watch?v=blahblahblah&feature=rec-LGOUT-exp_fresh+div-1r-1-HM')
|
21
|
-
a.service # 'Youtube'
|
22
|
-
a.media_id # 'blahblahblah'
|
23
|
-
a.original_url # 'http://www.youtube.com/watch?v=blahblahblah&feature=rec-LGOUT-exp_fresh+div-1r-1-HM'
|
24
|
-
a.uri # URI object for 'http://www.youtube.com/watch?v=blahblahblah&feature=rec-LGOUT-exp_fresh+div-1r-1-HM'
|
25
|
-
|
26
|
-
Due to variations in information which can be gathered from a uri, some services provide more information than others. For example:
|
27
|
-
* All but Imageshack have a +media_api_id+, which is the ID which can be used in API calls to the related services. Typically the same as +media_id+.
|
28
|
-
|
29
|
-
a.media_api_id # 'blahblahblah'
|
30
|
-
|
31
|
-
* A direct media url for Youtube, Photobucket, and Imageshack (img#{num}.imageshack.us/img#{num}/#{NUMBER}/#{IMAGENAME} format)
|
32
|
-
|
33
|
-
a.media_url # 'http://www.youtube.com/v/blahblahblah'
|
34
|
-
|
35
|
-
* A media landing website url for Youtube, Photobucket, Imageshack, Vimeo, and Flickr (flickr media_url's provide the flic.kr/p/ID short url)
|
36
|
-
|
37
|
-
a.website # 'http://www.youtube.com/watch?v=blahblahblah'
|
38
|
-
|
39
|
-
* Content type for Imageshack, Photobucket and Flickr URI's (flickr in the farm#{num}.static.flickr.com/ format)
|
40
|
-
|
41
|
-
a.content_type # 'jpg' (Content Type also for Imageshack and Photobucket)
|
42
|
-
|
43
|
-
* Thumbnails URL for Youtube Photobucket, and Flickr (flickr in the farm#{num}.static.flickr.com/ format)
|
44
|
-
|
45
|
-
a.media_thumbnail # 'http://i.ytimg.com/vi/4CYDFoEz8rg/default.jpg'
|
46
|
-
|
47
|
-
* Some additional information may be provided, which can be determined by looking through each filters code.
|
48
|
-
|
49
|
-
|
50
|
-
If an attribute is not present, muri returns +nil+.
|
51
|
-
|
52
|
-
I plan on including more services _and_ more parse information with updates. That being said, MURI is currently not production quality. Please use with caution and in development only. Thank you.
|
53
|
-
|
54
|
-
== Contact
|
55
|
-
|
56
|
-
If you would like to get in contact with me, my email is bananastalktome@gmail.com. I appreciate any information or assistance reverse-engineering media website URI's.
|