muri 0.0.13 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +8 -8
- data/VERSION.yml +2 -2
- data/lib/muri/base.rb +54 -74
- data/lib/muri/filter.rb +13 -0
- data/lib/muri/filters/facebook.rb +42 -44
- data/lib/muri/filters/flickr.rb +62 -34
- data/lib/muri/filters/imageshack.rb +23 -26
- data/lib/muri/filters/photobucket.rb +71 -59
- data/lib/muri/filters/twitpic.rb +20 -22
- data/lib/muri/filters/vimeo.rb +41 -33
- data/lib/muri/filters/youtube.rb +39 -36
- data/lib/muri.rb +4 -2
- data/muri.gemspec +8 -8
- data/test/error_test.rb +2 -2
- data/test/facebook_test.rb +30 -42
- data/test/flickr_test.rb +55 -55
- data/test/imageshack_test.rb +42 -38
- data/test/photobucket_test.rb +104 -123
- data/test/twitpic_test.rb +44 -25
- data/test/vimeo_test.rb +55 -55
- data/test/youtube_test.rb +76 -95
- metadata +16 -9
data/README.textile
CHANGED
@@ -8,7 +8,7 @@ MURI Currently supports:
|
|
8
8
|
* Vimeo (single videos and albums)
|
9
9
|
** "API documentation":http://vimeo.com/api/docs/simple-api
|
10
10
|
* Flickr (single images and sets)
|
11
|
-
** "API documentation":http://www.flickr.com/services/api/
|
11
|
+
** "API documentation":http://www.flickr.com/services/api/ or "[2]":http://developer.yahoo.com/flickr/
|
12
12
|
* Imageshack
|
13
13
|
* Photobucket
|
14
14
|
** "API documentation":http://photobucket.com/developer/documentation
|
@@ -41,10 +41,10 @@ Assuming the URI was successfully parsed (thus @a.valid? == true@), all media ty
|
|
41
41
|
|
42
42
|
<pre>
|
43
43
|
<code>
|
44
|
-
a.
|
45
|
-
a.media_id
|
46
|
-
a.
|
47
|
-
a.
|
44
|
+
a.media_service # 'Youtube'
|
45
|
+
a.media_id # 'blahblahblah'
|
46
|
+
a.media_original_url # 'http://www.youtube.com/watch?v=blahblahblah&feature=rec-LGOUT-exp_fresh+div-1r-1-HM'
|
47
|
+
a.media_uri # URI object for 'http://www.youtube.com/watch?v=blahblahblah&feature=rec-LGOUT-exp_fresh+div-1r-1-HM'
|
48
48
|
</code>
|
49
49
|
</pre>
|
50
50
|
|
@@ -53,7 +53,7 @@ Assuming the URI was successfully parsed (thus @a.valid? == true@), all media ty
|
|
53
53
|
* 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@.
|
54
54
|
|
55
55
|
<pre>
|
56
|
-
<code>
|
56
|
+
<code>
|
57
57
|
a.media_api_id # 'blahblahblah'
|
58
58
|
</code>
|
59
59
|
</pre>
|
@@ -76,7 +76,7 @@ d
|
|
76
76
|
|
77
77
|
<pre>
|
78
78
|
<code>
|
79
|
-
a.
|
79
|
+
a.media_website # 'http://www.youtube.com/watch?v=blahblahblah'
|
80
80
|
</code>
|
81
81
|
</pre>
|
82
82
|
|
@@ -84,7 +84,7 @@ d
|
|
84
84
|
|
85
85
|
<pre>
|
86
86
|
<code>
|
87
|
-
a.
|
87
|
+
a.media_content_type # 'jpg' (Content Type also for Imageshack and Photobucket)
|
88
88
|
</code>
|
89
89
|
</pre>
|
90
90
|
|
data/VERSION.yml
CHANGED
data/lib/muri/base.rb
CHANGED
@@ -1,112 +1,92 @@
|
|
1
|
-
require 'uri'
|
2
1
|
class Muri
|
3
2
|
|
3
|
+
attr_reader :uri, :errors
|
4
|
+
|
4
5
|
# NoParser raised if no parser is found for URI
|
5
6
|
class NoParser < StandardError; end
|
6
|
-
|
7
|
-
# UnsupportedURI raised if parser is found, but URI path does not
|
7
|
+
|
8
|
+
# UnsupportedURI raised if parser is found, but URI path does not
|
8
9
|
# match accepted formats
|
9
10
|
class UnsupportedURI < ArgumentError; end
|
10
|
-
|
11
|
-
PARSERS = {}
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
11
|
+
|
12
|
+
PARSERS = { }
|
13
|
+
|
14
|
+
# Defines is_#{service}? and is_#{service type constant}? methods, and sets service name constnat
|
15
|
+
['Youtube', 'Flickr', 'Vimeo', 'Imageshack', 'Photobucket', 'Facebook', 'Twitpic'].each do |filter|
|
16
|
+
eval "include Filter::#{filter}"
|
17
|
+
is_service = "is_#{filter.downcase}?"
|
18
|
+
define_method(is_service) { self.media_service == filter }
|
19
|
+
self.constants.reject { |c| c !~ /^#{filter.upcase}/ }.each do |exp|
|
20
|
+
define_method("is_#{exp.downcase}?") { self.media_api_type == eval(exp) && eval("self.#{is_service}") }
|
21
|
+
end
|
22
|
+
const_set "#{filter.upcase}_SERVICE_NAME", "#{filter}"
|
23
|
+
end
|
20
24
|
|
21
25
|
def self.parse(url)
|
22
26
|
self.new(url)
|
23
27
|
end
|
24
|
-
|
25
|
-
def initialize(url)
|
26
|
-
@info = { }
|
27
|
-
_parse(url)
|
28
|
-
end
|
29
28
|
|
30
|
-
|
31
|
-
|
29
|
+
# Show a list of the available parsers
|
30
|
+
def self.parsers
|
31
|
+
PARSERS.keys
|
32
32
|
end
|
33
33
|
|
34
|
-
def
|
35
|
-
@info
|
34
|
+
def initialize(url)
|
35
|
+
@info = { }
|
36
|
+
_parse(url)
|
36
37
|
end
|
37
38
|
|
39
|
+
# Determine if Muri object is valid (errors mean not valid)
|
38
40
|
def valid?
|
39
|
-
|
41
|
+
self.errors.nil?
|
40
42
|
end
|
41
43
|
|
42
|
-
|
43
|
-
|
44
|
-
def inspect
|
45
|
-
@@to_s.bind(self).call.sub!(/>\z/) {" URL:#{self.original_url}>"}
|
44
|
+
def to_s
|
45
|
+
@info.to_s
|
46
46
|
end
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
|
48
|
+
# 'Borrowed' from uri/generic.rb
|
49
|
+
def inspect
|
50
|
+
Kernel.instance_method(:to_s).bind(self).call.sub!(/>\z/) {" URL:#{self.uri.to_s}>"}
|
50
51
|
end
|
51
|
-
|
52
|
+
|
52
53
|
private
|
54
|
+
attr_writer :uri, :errors
|
55
|
+
|
56
|
+
def self.determine_feed_parser(uri)
|
57
|
+
PARSERS.keys.detect {|klass| klass.parsable?(uri)}
|
58
|
+
end
|
53
59
|
|
54
60
|
def _parse(raw_url)
|
55
61
|
begin
|
56
|
-
|
57
|
-
if
|
62
|
+
self.uri = URI.parse(raw_url)
|
63
|
+
if self.uri.scheme.nil?
|
58
64
|
raw_url = "http://#{raw_url}"
|
59
|
-
|
65
|
+
self.uri = URI.parse(raw_url)
|
60
66
|
end
|
61
|
-
if parser = determine_feed_parser
|
62
|
-
@info[:uri] = @url
|
63
|
-
@info[:original_url] = raw_url
|
67
|
+
if parser = Muri.determine_feed_parser(self.uri)
|
64
68
|
send(PARSERS[parser])
|
65
69
|
else
|
66
70
|
raise NoParser
|
67
71
|
end
|
68
72
|
rescue NoParser, UnsupportedURI, URI::BadURIError, URI::InvalidURIError => e
|
69
|
-
|
73
|
+
self.errors = "#{e.class}"
|
70
74
|
end
|
71
75
|
end
|
72
|
-
|
73
|
-
def
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
@info[func.to_sym].nil? ? nil : @info[func.to_sym]
|
79
|
-
end
|
80
|
-
|
81
|
-
protected
|
82
|
-
|
83
|
-
#used by flickr. Ported from PHP.
|
84
|
-
def self.decode58(str)
|
85
|
-
decoded = 0
|
86
|
-
multi = 1
|
87
|
-
alphabet = "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"
|
88
|
-
while str.length > 0
|
89
|
-
digit = str[(str.length - 1),1]
|
90
|
-
decoded += multi * alphabet.index(digit)
|
91
|
-
multi = multi * alphabet.length
|
92
|
-
str.chop!
|
76
|
+
|
77
|
+
def method_missing(method, *arguments, &block)
|
78
|
+
if method.to_s =~ /^media_(.+)/
|
79
|
+
process_option_method(method, *arguments)
|
80
|
+
else
|
81
|
+
super
|
93
82
|
end
|
94
|
-
|
95
|
-
decoded
|
96
83
|
end
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
while str >= base_count
|
104
|
-
div = str / base_count
|
105
|
-
mod = (str-(base_count * div))
|
106
|
-
encoded = alphabet[mod,1] + encoded
|
107
|
-
str = div
|
84
|
+
|
85
|
+
def process_option_method(method, *arguments)
|
86
|
+
if method.to_s =~ /^media_(.+)=/
|
87
|
+
@info[$1.to_sym] = arguments.first
|
88
|
+
elsif method.to_s =~ /^media_(.+)/
|
89
|
+
@info[$1.to_sym]
|
108
90
|
end
|
109
|
-
encoded = (alphabet[str,1] + encoded) if str
|
110
|
-
encoded
|
111
91
|
end
|
112
92
|
end
|
data/lib/muri/filter.rb
CHANGED
@@ -1,68 +1,66 @@
|
|
1
|
-
require 'cgi'
|
2
1
|
class Muri
|
3
2
|
module Filter
|
4
3
|
module Facebook
|
5
|
-
|
4
|
+
|
5
|
+
private
|
6
6
|
FACEBOOK_PHOTO = "photo"
|
7
7
|
#FACEBOOK_VIDEO = "video"
|
8
8
|
FACEBOOK_ALBUM = "album"
|
9
|
-
|
9
|
+
REGEX_FACEBOOK_PHOTO = /^\/photo\.php$/i
|
10
|
+
REGEX_FACEBOOK_ALBUM = /^\/album\.php$/i
|
11
|
+
|
10
12
|
def self.included(base)
|
11
13
|
base.class_eval do
|
12
14
|
self::PARSERS[Muri::Filter::Facebook] = "facebook_parse"
|
13
15
|
end
|
14
16
|
end
|
15
|
-
|
17
|
+
|
18
|
+
def self.parsable?(uri)
|
19
|
+
uri.host =~ /^(www\.)?facebook\.com$/i
|
20
|
+
end
|
21
|
+
|
16
22
|
def facebook_parse
|
17
|
-
|
18
|
-
params =
|
23
|
+
self.media_service = FACEBOOK_SERVICE_NAME #'Facebook'
|
24
|
+
params = Muri.param_parse(self.uri.query)
|
25
|
+
|
19
26
|
url_common = "http://www.facebook.com"
|
20
|
-
|
21
|
-
# if
|
27
|
+
|
28
|
+
# if self.uri.path =~ /^\/v\/([0-9]+)/
|
22
29
|
# @info[:media_id] = $1
|
23
30
|
# @info[:media_url] = "#{url_common}/v/#{@info[:media_id]}"
|
24
|
-
#
|
31
|
+
#
|
25
32
|
# # Currently no API for video, but media_id is best guess value for such content
|
26
33
|
# @info[:media_api_id] = @info[:media_id]
|
27
34
|
# @info[:media_api_type] = FACEBOOK_VIDEO
|
28
|
-
if ((
|
29
|
-
params
|
30
|
-
params
|
31
|
-
params
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
media_creator = params["id"]
|
36
|
-
share_key = params["l"]
|
37
|
-
|
38
|
-
|
39
|
-
elsif ((
|
40
|
-
params
|
41
|
-
params
|
42
|
-
params
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
media_creator = params["id"]
|
47
|
-
share_key = params["l"]
|
48
|
-
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
if self.valid?
|
53
|
-
# The media_api_id is the PID which can be searched for in the facebook photos/albums table
|
54
|
-
@info[:media_api_id] = (media_creator.to_i << 32) + @info[:media_id].to_i
|
35
|
+
if ((self.uri.path =~ REGEX_FACEBOOK_PHOTO) &&
|
36
|
+
params["pid"] =~ /^([0-9]+)$/ &&
|
37
|
+
params["id"] =~ /^([0-9]+)$/ &&
|
38
|
+
params["l"] =~ /^([0-9a-z]+)$/i)
|
39
|
+
|
40
|
+
self.media_api_type = FACEBOOK_PHOTO
|
41
|
+
self.media_id = params["pid"]
|
42
|
+
media_creator = params["id"]
|
43
|
+
share_key = params["l"]
|
44
|
+
|
45
|
+
self.media_website = "#{url_common}/photo.php?pid=#{self.media_id}&l=#{share_key}&id=#{media_creator}"
|
46
|
+
elsif ((self.uri.path =~ REGEX_FACEBOOK_ALBUM) &&
|
47
|
+
params["aid"] =~ /^([0-9]+)$/ &&
|
48
|
+
params["id"] =~ /^([0-9]+)$/ &&
|
49
|
+
params["l"] =~ /^([0-9a-z]+)$/i)
|
50
|
+
|
51
|
+
self.media_api_type = FACEBOOK_ALBUM
|
52
|
+
self.media_id = params["aid"]
|
53
|
+
media_creator = params["id"]
|
54
|
+
share_key = params["l"]
|
55
|
+
|
56
|
+
self.media_website = "#{url_common}/album.php?aid=#{self.media_id}&l=#{share_key}&id=#{media_creator}"
|
55
57
|
else
|
56
58
|
raise UnsupportedURI
|
57
59
|
end
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
def self.parsable?(uri)
|
63
|
-
uri.host =~ /^(www\.)?facebook\.com$/i
|
60
|
+
|
61
|
+
# The media_api_id is the PID which can be searched for in the facebook photos/albums table
|
62
|
+
self.media_api_id = (media_creator.to_i << 32) +self.media_id.to_i
|
64
63
|
end
|
65
|
-
|
66
64
|
end
|
67
65
|
end
|
68
66
|
end
|
@@ -73,4 +71,4 @@ end
|
|
73
71
|
# id = user id
|
74
72
|
# l = photo share key
|
75
73
|
# http://www.facebook.com/v/614695029223 (full) - deprecated
|
76
|
-
# http://www.facebook.com/album.php?aid=2149275&id=15201063&l=99900807c3
|
74
|
+
# http://www.facebook.com/album.php?aid=2149275&id=15201063&l=99900807c3
|
data/lib/muri/filters/flickr.rb
CHANGED
@@ -1,56 +1,84 @@
|
|
1
1
|
class Muri
|
2
2
|
module Filter
|
3
3
|
module Flickr
|
4
|
-
|
4
|
+
|
5
|
+
private
|
5
6
|
FLICKR_PHOTO = "photo"
|
6
7
|
FLICKR_SET = "set"
|
7
|
-
|
8
|
+
|
9
|
+
REGEX_FLICKR_PHOTO_OR_SET = /^\/photos\/([a-z0-9\-\_\@]+?)\/(sets\/)?([0-9]+)/i
|
10
|
+
REGEX_FLICKR_STATIC_PHOTO = /^farm([1-3])\.static.flickr.com\/([0-9]+?)\/([0-9]+?)\_([a-z0-9]+?)((?:\_[a-z]){1,2}){0,1}\.([a-z]+)/i
|
11
|
+
REGEX_FLICKR_SHORTURL = /^flic\.kr\/p\/([a-z0-9]+)/i
|
12
|
+
|
8
13
|
def self.included(base)
|
9
14
|
base.class_eval do
|
10
15
|
self::PARSERS[Muri::Filter::Flickr] = "flickr_parse"
|
11
16
|
end
|
12
17
|
end
|
13
|
-
|
18
|
+
|
19
|
+
def self.parsable?(uri)
|
20
|
+
uri.host =~ /^(www\.)?(flic\.kr|(farm[0-9]\.static\.|)(flickr)\.com)/i
|
21
|
+
end
|
22
|
+
|
14
23
|
def flickr_parse
|
15
|
-
|
16
|
-
|
17
|
-
if
|
24
|
+
self.media_service = FLICKR_SERVICE_NAME #'Flickr'
|
25
|
+
|
26
|
+
if self.uri.path =~ REGEX_FLICKR_PHOTO_OR_SET
|
18
27
|
media_creator = $1
|
19
|
-
|
20
|
-
|
21
|
-
elsif (
|
28
|
+
self.media_id = $3
|
29
|
+
self.media_api_type = $2.nil? ? FLICKR_PHOTO : FLICKR_SET
|
30
|
+
elsif (self.uri.host + self.uri.path) =~ REGEX_FLICKR_STATIC_PHOTO
|
22
31
|
farm = $1
|
23
32
|
server_id = $2
|
24
|
-
|
25
|
-
|
33
|
+
self.media_id = $3
|
34
|
+
self.media_api_type = FLICKR_PHOTO
|
26
35
|
media_secret = $4
|
27
|
-
url_prefix = "http://farm#{farm}.static.flickr.com/#{server_id}/#{
|
28
|
-
|
29
|
-
|
30
|
-
elsif (
|
31
|
-
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
if self.valid?
|
36
|
-
@info[:media_api_id] = @info[:media_id]
|
37
|
-
if @info[:media_api_type] == FLICKR_PHOTO
|
38
|
-
@info[:website] = "http://flic.kr/p/" + self.class.encode58(@info[:media_id].to_i)
|
39
|
-
elsif @info[:media_api_type] == FLICKR_SET
|
40
|
-
@info[:website] = "http://www.flickr.com/photos/#{media_creator}/sets/#{@info[:media_id]}"#/show takes direct
|
41
|
-
end
|
36
|
+
url_prefix = "http://farm#{farm}.static.flickr.com/#{server_id}/#{self.media_id}_#{media_secret}"
|
37
|
+
self.media_url = "#{url_prefix}.jpg"
|
38
|
+
self.media_thumbnail = "#{url_prefix}_t.jpg"
|
39
|
+
elsif (self.uri.host + self.uri.path) =~ REGEX_FLICKR_SHORTURL
|
40
|
+
self.media_id = Filter::Flickr.decode58($1)
|
41
|
+
self.media_api_type = FLICKR_PHOTO
|
42
42
|
else
|
43
43
|
raise UnsupportedURI
|
44
44
|
end
|
45
|
-
|
46
|
-
self
|
45
|
+
|
46
|
+
self.media_api_id = self.media_id
|
47
|
+
if self.is_flickr_photo?
|
48
|
+
self.media_website = "http://flic.kr/p/" + Filter::Flickr.encode58(self.media_id.to_i)
|
49
|
+
elsif self.is_flickr_set?
|
50
|
+
self.media_website = "http://www.flickr.com/photos/#{media_creator}/sets/#{self.media_id}" # appending /show takes direct to image through redirect
|
51
|
+
end
|
47
52
|
end
|
48
53
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
+
# Ported from PHP.
|
55
|
+
def self.decode58(str)
|
56
|
+
decoded = 0
|
57
|
+
multi = 1
|
58
|
+
alphabet = "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"
|
59
|
+
while str.length > 0
|
60
|
+
digit = str[(str.length - 1),1]
|
61
|
+
decoded += multi * alphabet.index(digit)
|
62
|
+
multi = multi * alphabet.length
|
63
|
+
str.chop!
|
64
|
+
end
|
65
|
+
decoded
|
66
|
+
end
|
67
|
+
|
68
|
+
# Ported from PHP.
|
69
|
+
def self.encode58(str)
|
70
|
+
alphabet = "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"
|
71
|
+
base_count = alphabet.length
|
72
|
+
encoded = ''
|
73
|
+
while str >= base_count
|
74
|
+
div = str / base_count
|
75
|
+
mod = (str-(base_count * div))
|
76
|
+
encoded = alphabet[mod,1] + encoded
|
77
|
+
str = div
|
78
|
+
end
|
79
|
+
encoded = (alphabet[str,1] + encoded) if str
|
80
|
+
encoded
|
81
|
+
end
|
54
82
|
end
|
55
83
|
end
|
56
84
|
end
|
@@ -61,7 +89,7 @@ end
|
|
61
89
|
# when '_m' then 'small'
|
62
90
|
# when '_b' then 'large'
|
63
91
|
# when '_o' then 'original'
|
64
|
-
# else
|
92
|
+
# else 'medium'
|
65
93
|
# end
|
66
94
|
# end
|
67
95
|
# @info[:content_type] = $6
|
@@ -2,43 +2,40 @@ class Muri
|
|
2
2
|
module Filter
|
3
3
|
module Imageshack
|
4
4
|
|
5
|
+
private
|
6
|
+
|
5
7
|
def self.included(base)
|
6
8
|
base.class_eval do
|
7
9
|
self::PARSERS[Muri::Filter::Imageshack] = "imageshack_parse"
|
8
10
|
end
|
9
11
|
end
|
10
|
-
|
12
|
+
|
13
|
+
def self.parsable?(uri)
|
14
|
+
uri.host =~ /^img([0-9]*?)\.imageshack\.us$/i #/^(img([0-9]*?)\.imageshack\.us)|(yfrog\.com)/i
|
15
|
+
end
|
16
|
+
|
11
17
|
def imageshack_parse
|
12
|
-
|
13
|
-
|
14
|
-
|
18
|
+
self.media_service = IMAGESHACK_SERVICE_NAME #'Imageshack'
|
19
|
+
|
20
|
+
self.uri.host =~ /^img([0-9]*?)\.imageshack\.us/i
|
15
21
|
server_id = $1
|
16
22
|
url_common = "http://img#{server_id}.imageshack.us"
|
17
|
-
|
18
|
-
if
|
19
|
-
|
20
|
-
|
21
|
-
elsif
|
23
|
+
|
24
|
+
if self.uri.path =~ /^\/i\/([a-z0-9]+?)\.([a-z0-9]+)(\/)?/i
|
25
|
+
self.media_id = $1
|
26
|
+
self.media_content_type = $2
|
27
|
+
elsif self.uri.path =~ /^\/img([0-9]*?)\/([0-9]+?)\/([a-z0-9]+?)\.([a-z0-9]+)/i
|
22
28
|
content_server_id = $2
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
end
|
27
|
-
|
28
|
-
# imageshack does not currently have API for retrieving individual video information
|
29
|
-
if self.valid?
|
30
|
-
@info[:website] = "#{url_common}/i/#{@info[:media_id]}.#{@info[:content_type]}/"
|
29
|
+
self.media_id = $3
|
30
|
+
self.media_content_type = $4
|
31
|
+
self.media_url = "#{url_common}/img#{server_id}/#{content_server_id}/#{self.media_id}.#{self.media_content_type}"
|
31
32
|
else
|
32
|
-
raise UnsupportedURI
|
33
|
+
raise UnsupportedURI
|
33
34
|
end
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
def self.parsable?(uri)
|
39
|
-
uri.host =~ /^img([0-9]*?)\.imageshack\.us$/i #/^(img([0-9]*?)\.imageshack\.us)|(yfrog\.com)/i
|
40
|
-
end
|
41
|
-
|
35
|
+
|
36
|
+
# imageshack does not currently have API for retrieving individual video information
|
37
|
+
self.media_website = "#{url_common}/i/#{self.media_id}.#{self.media_content_type}/"
|
38
|
+
end
|
42
39
|
end
|
43
40
|
end
|
44
41
|
end
|