muri 1.1.2 → 1.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +13 -0
- data/README.textile +1 -1
- data/VERSION.yml +2 -1
- data/lib/muri/base.rb +4 -10
- data/lib/muri/filters/facebook.rb +36 -45
- data/lib/muri/filters/flickr.rb +9 -9
- data/lib/muri/filters/picasa.rb +6 -7
- data/muri.gemspec +3 -2
- data/test/facebook_test.rb +41 -6
- data/test/flickr_test.rb +3 -3
- data/test/photobucket_test.rb +3 -3
- metadata +4 -3
data/CHANGELOG
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Muri Changelog
|
2
|
+
===================================
|
3
|
+
|
4
|
+
Version 1.1.3
|
5
|
+
* Changed "FLICKR_PHOTO" to "FLICKR_MEDIA" (since it can parse videos)
|
6
|
+
- "flickr_photo?" is replaced by "flickr_media?" now
|
7
|
+
* Facebook parser overhaul thanks to their new 'Graph API'
|
8
|
+
- media_api_id is no longer the true facebook database API id for photos, though it is now for videos
|
9
|
+
- Facebook parser accepts video URL's, but albums temporarily disabled
|
10
|
+
* Removed deprecated "is_" methods
|
11
|
+
* Changed service names all lowercase letters (eg. "Vimeo" to "vimeo").
|
12
|
+
- Should not have any major impact on usage, mostly an internal change.
|
13
|
+
* URL parse now only escapes spaces, not all characters (allows # to create URI fragment)
|
data/README.textile
CHANGED
@@ -62,7 +62,7 @@ Assuming the URI was successfully parsed (thus @a.valid? == true@), all media ty
|
|
62
62
|
* 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)
|
63
63
|
|
64
64
|
|
65
|
-
*NOTE: Facebook photos return a @media_api_id@
|
65
|
+
*NOTE: Facebook photos return a @media_api_id@ hash, keyed for photos by @uid@ and @pid@ (user and photo id, not the true Graph API id), and for videos by @v@ (the video id)*
|
66
66
|
|
67
67
|
*ALSO NOTE: Picasa @media_api_id@ is a partial string for using the photo API call, so for example @'bananastalktome/album/TestForAPI/photoid/5450524726782297346'@, thus the API call would be @"http://picasaweb.google.com/data/feed/api/user/#{media_api_id}"@*
|
68
68
|
|
data/VERSION.yml
CHANGED
data/lib/muri/base.rb
CHANGED
@@ -9,25 +9,19 @@ class Muri
|
|
9
9
|
# match accepted formats
|
10
10
|
class UnsupportedURI < ArgumentError; end
|
11
11
|
|
12
|
-
AVAILABLE_PARSERS = %w[
|
12
|
+
AVAILABLE_PARSERS = %w[youtube flickr vimeo imageshack photobucket facebook twitpic picasa].freeze
|
13
13
|
|
14
14
|
PARSERS = { }
|
15
15
|
|
16
16
|
# Defines #{service}? and #{service_type}? methods, and sets service name constnat
|
17
17
|
AVAILABLE_PARSERS.each do |parser|
|
18
|
-
eval "include Filter::#{parser}"
|
19
|
-
|
20
|
-
service = "#{parser.downcase}?"
|
18
|
+
eval "include Filter::#{parser.capitalize}"
|
19
|
+
service = "#{parser}?"
|
21
20
|
define_method(service) { self.media_service == parser }
|
22
|
-
define_method(is_service) { puts "This method will be deprecated, use #{service} instead"; self.instance_eval(service) }
|
23
21
|
self.constants.reject { |c| c !~ /^#{parser.upcase}/ }.each do |exp|
|
24
22
|
define_method("#{exp.downcase}?") do
|
25
23
|
self.media_api_type == eval(exp) && self.instance_eval(service)
|
26
24
|
end
|
27
|
-
define_method("is_#{exp.downcase}?") do
|
28
|
-
puts "This method will be deprecated, use #{exp.downcase}? instead"
|
29
|
-
self.instance_eval("#{exp.downcase}?")
|
30
|
-
end
|
31
25
|
end
|
32
26
|
const_set "#{parser.upcase}_SERVICE_NAME", "#{parser}"
|
33
27
|
end
|
@@ -69,7 +63,7 @@ class Muri
|
|
69
63
|
|
70
64
|
def parse(raw_url)
|
71
65
|
begin
|
72
|
-
raw_url = URI.encode(URI.decode(raw_url)) unless raw_url.nil?
|
66
|
+
raw_url = URI.encode(URI.decode(raw_url), " ") unless raw_url.nil?
|
73
67
|
self.uri = URI.parse(raw_url)
|
74
68
|
if self.uri.scheme.nil?
|
75
69
|
raw_url = "http://#{raw_url}"
|
@@ -4,10 +4,12 @@ class Muri
|
|
4
4
|
|
5
5
|
private
|
6
6
|
FACEBOOK_PHOTO = "photo"
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
FACEBOOK_VIDEO = "video"
|
8
|
+
|
9
|
+
#FACEBOOK_ALBUM = "album"
|
10
|
+
REGEX_FACEBOOK_PHOTO = /\/photo\.php/i
|
11
|
+
REGEX_FACEBOOK_VIDEO = /\/video\/video\.php/i
|
12
|
+
#REGEX_FACEBOOK_ALBUM = /^\/album\.php$/i
|
11
13
|
|
12
14
|
def self.included(base)
|
13
15
|
base.class_eval do
|
@@ -20,55 +22,44 @@ class Muri
|
|
20
22
|
end
|
21
23
|
|
22
24
|
def facebook_parse
|
23
|
-
self.media_service = FACEBOOK_SERVICE_NAME #'
|
24
|
-
params = Muri.param_parse(self.uri.query)
|
25
|
+
self.media_service = FACEBOOK_SERVICE_NAME #'facebook'
|
25
26
|
|
26
|
-
|
27
|
+
url_string = self.uri.fragment.nil? ? (self.uri.path.to_s + "?" + self.uri.query.to_s) : self.uri.fragment
|
27
28
|
|
28
|
-
|
29
|
-
# @info[:media_id] = $1
|
30
|
-
# @info[:media_url] = "#{url_common}/v/#{@info[:media_id]}"
|
31
|
-
#
|
32
|
-
# # Currently no API for video, but media_id is best guess value for such content
|
33
|
-
# @info[:media_api_id] = @info[:media_id]
|
34
|
-
# @info[:media_api_type] = FACEBOOK_VIDEO
|
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)
|
29
|
+
url_common = "http://www.facebook.com"
|
39
30
|
|
31
|
+
if (url_string =~ REGEX_FACEBOOK_VIDEO && (v = url_string.gsub(/\A.*?v=(\d+)(&.*|\Z)/i, '\1')))
|
32
|
+
|
33
|
+
self.media_api_type = FACEBOOK_VIDEO
|
34
|
+
self.media_id = v
|
35
|
+
self.media_api_id = {:v => v}
|
36
|
+
self.media_website = "#{url_common}/video/video.php?v=#{self.media_id}"
|
37
|
+
elsif (url_string =~ REGEX_FACEBOOK_PHOTO &&
|
38
|
+
(pid = url_string.gsub(/\A.*?pid=(\d+)(&.*|\Z)/i, '\1')) &&
|
39
|
+
(uid = url_string.gsub(/\A.*?[^p]id=(\d+)(&.*|\Z)/i, '\1')))
|
40
|
+
|
40
41
|
self.media_api_type = FACEBOOK_PHOTO
|
41
|
-
self.media_id =
|
42
|
-
media_creator =
|
43
|
-
|
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)
|
42
|
+
self.media_id = pid
|
43
|
+
media_creator = uid
|
44
|
+
self.media_api_id = {:pid => pid, :uid => media_creator}
|
50
45
|
|
51
|
-
self.
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
46
|
+
self.media_website = "#{url_common}/photo.php?pid=#{self.media_id}&id=#{media_creator}"
|
47
|
+
# elsif ((self.uri.path =~ REGEX_FACEBOOK_ALBUM) &&
|
48
|
+
# params["aid"] =~ /^([0-9]+)$/ &&
|
49
|
+
# params["id"] =~ /^([0-9]+)$/ &&
|
50
|
+
# params["l"] =~ /^([0-9a-z]+)$/i)
|
51
|
+
#
|
52
|
+
# self.media_api_type = FACEBOOK_ALBUM
|
53
|
+
# self.media_id = params["aid"]
|
54
|
+
# media_creator = params["id"]
|
55
|
+
# share_key = params["l"]
|
56
|
+
#
|
57
|
+
# self.media_website = "#{url_common}/album.php?aid=#{self.media_id}&l=#{share_key}&id=#{media_creator}"
|
57
58
|
else
|
58
59
|
raise UnsupportedURI
|
59
60
|
end
|
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
|
61
|
+
|
63
62
|
end
|
64
63
|
end
|
65
64
|
end
|
66
|
-
end
|
67
|
-
# http://www.facebook.com/album.php?aid=2131184&id=15201063&l=8917e51479
|
68
|
-
# http://www.facebook.com/photo.php?pid=34929102&l=a1abf8cd37&id=15201063 (preview)
|
69
|
-
# database_pid = (USER_ID << 32) + PID
|
70
|
-
# pid = photo id
|
71
|
-
# id = user id
|
72
|
-
# l = photo share key
|
73
|
-
# http://www.facebook.com/v/614695029223 (full) - deprecated
|
74
|
-
# http://www.facebook.com/album.php?aid=2149275&id=15201063&l=99900807c3
|
65
|
+
end
|
data/lib/muri/filters/flickr.rb
CHANGED
@@ -3,11 +3,11 @@ class Muri
|
|
3
3
|
module Flickr
|
4
4
|
|
5
5
|
private
|
6
|
-
|
6
|
+
FLICKR_MEDIA = "media"
|
7
7
|
FLICKR_SET = "set"
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
REGEX_FLICKR_MEDIA_OR_SET = /^\/photos\/([a-z0-9\-\_\@]+?)\/(sets\/)?([0-9]+)/i
|
10
|
+
REGEX_FLICKR_STATIC_MEDIA = /^farm([1-3])\.static.flickr.com\/([0-9]+?)\/([0-9]+?)\_([a-z0-9]+?)((?:\_[a-z]){1,2}){0,1}\.([a-z]+)/i
|
11
11
|
REGEX_FLICKR_SHORTURL = /^flic\.kr\/p\/([a-z0-9]+)/i
|
12
12
|
|
13
13
|
def self.included(base)
|
@@ -23,28 +23,28 @@ class Muri
|
|
23
23
|
def flickr_parse
|
24
24
|
self.media_service = FLICKR_SERVICE_NAME #'Flickr'
|
25
25
|
|
26
|
-
if self.uri.path =~
|
26
|
+
if self.uri.path =~ REGEX_FLICKR_MEDIA_OR_SET
|
27
27
|
media_creator = $1
|
28
28
|
self.media_id = $3
|
29
|
-
self.media_api_type = $2.nil? ?
|
30
|
-
elsif (self.uri.host + self.uri.path) =~
|
29
|
+
self.media_api_type = $2.nil? ? FLICKR_MEDIA : FLICKR_SET
|
30
|
+
elsif (self.uri.host + self.uri.path) =~ REGEX_FLICKR_STATIC_MEDIA
|
31
31
|
farm = $1
|
32
32
|
server_id = $2
|
33
33
|
self.media_id = $3
|
34
|
-
self.media_api_type =
|
34
|
+
self.media_api_type = FLICKR_MEDIA
|
35
35
|
media_secret = $4
|
36
36
|
url_prefix = "http://farm#{farm}.static.flickr.com/#{server_id}/#{self.media_id}_#{media_secret}"
|
37
37
|
self.media_url = "#{url_prefix}.jpg"
|
38
38
|
self.media_thumbnail = "#{url_prefix}_t.jpg"
|
39
39
|
elsif (self.uri.host + self.uri.path) =~ REGEX_FLICKR_SHORTURL
|
40
40
|
self.media_id = Filter::Flickr.decode58($1)
|
41
|
-
self.media_api_type =
|
41
|
+
self.media_api_type = FLICKR_MEDIA
|
42
42
|
else
|
43
43
|
raise UnsupportedURI
|
44
44
|
end
|
45
45
|
|
46
46
|
self.media_api_id = self.media_id
|
47
|
-
if self.
|
47
|
+
if self.flickr_media?
|
48
48
|
self.media_website = "http://flic.kr/p/" + Filter::Flickr.encode58(self.media_id.to_i)
|
49
49
|
elsif self.flickr_set?
|
50
50
|
self.media_website = "http://www.flickr.com/photos/#{media_creator}/sets/#{self.media_id}" # appending /show takes direct to image through redirect
|
data/lib/muri/filters/picasa.rb
CHANGED
@@ -19,14 +19,12 @@ class Muri
|
|
19
19
|
self.media_service = PICASA_SERVICE_NAME
|
20
20
|
url_common = "http://picasaweb.google.com"
|
21
21
|
|
22
|
-
|
23
|
-
#reencoded_url = URI.parse(URI.encode self.uri.to_s)
|
24
|
-
|
25
|
-
if self.uri.path =~ /^\/(.[^\/]+)\/(.[^\/]+)/i
|
22
|
+
if (self.uri.path =~ /^\/(.[^\/]+)\/(.[^\/]+)/i) && !self.uri.fragment.nil?
|
26
23
|
username = $1
|
27
|
-
|
24
|
+
album = $2 #album_photoid[0..-2].join("#") #in case other hash symbols exist
|
25
|
+
|
26
|
+
album_photoid = self.uri.fragment.split("#")
|
28
27
|
photoid = album_photoid.last
|
29
|
-
album = album_photoid[0..-2].join("#") #in case other hash symbols exist
|
30
28
|
self.media_id = photoid
|
31
29
|
self.media_website = "#{url_common}/#{username}/#{album}##{photoid}"
|
32
30
|
self.media_api_type = PICASA_PHOTO
|
@@ -41,4 +39,5 @@ class Muri
|
|
41
39
|
end
|
42
40
|
# http://picasaweb.google.com/bananastalktome/TestForAPI#5450524726782297346
|
43
41
|
# API Call: http://picasaweb.google.com/data/feed/api/user/bananastalktome/album/TestForAPI/photoid/5450524726782297346
|
44
|
-
# #=%23
|
42
|
+
# #=%23
|
43
|
+
# http://picasaweb.google.com/data/entry/api/user/bananastalktome/photoid/5450524726782297346
|
data/muri.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{muri}
|
8
|
-
s.version = "1.1.
|
8
|
+
s.version = "1.1.4"
|
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-04-
|
12
|
+
s.date = %q{2010-04-29}
|
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 = [
|
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
|
|
17
17
|
]
|
18
18
|
s.files = [
|
19
19
|
".gitignore",
|
20
|
+
"CHANGELOG",
|
20
21
|
"README.textile",
|
21
22
|
"Rakefile",
|
22
23
|
"VERSION.yml",
|
data/test/facebook_test.rb
CHANGED
@@ -17,6 +17,24 @@ shared_examples_for "Facebook parse" do
|
|
17
17
|
@a.valid?.should == true
|
18
18
|
end
|
19
19
|
end
|
20
|
+
shared_examples_for "Facebook parse video" do
|
21
|
+
it_should_behave_like "Facebook parse"
|
22
|
+
it "should have media api type = FACEBOOK_VIDEO" do
|
23
|
+
@a.media_api_type.should == Muri::FACEBOOK_VIDEO
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should be facebook video" do
|
27
|
+
@a.facebook_video?.should == true
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should not be facebook photo" do
|
31
|
+
@a.facebook_photo?.should == false
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should not be flickr media" do
|
35
|
+
@a.flickr_media?.should == false
|
36
|
+
end
|
37
|
+
end
|
20
38
|
|
21
39
|
shared_examples_for "Facebook parse photo" do
|
22
40
|
it_should_behave_like "Facebook parse"
|
@@ -28,22 +46,39 @@ shared_examples_for "Facebook parse photo" do
|
|
28
46
|
@a.facebook_photo?.should == true
|
29
47
|
end
|
30
48
|
|
31
|
-
it "should not be flickr
|
32
|
-
@a.
|
49
|
+
it "should not be flickr media" do
|
50
|
+
@a.flickr_media?.should == false
|
33
51
|
end
|
34
52
|
end
|
35
53
|
|
36
54
|
{'http://www.facebook.com/photo.php?pid=34929102&l=a1abf8cd37&id=15201063' =>
|
37
|
-
{ :
|
38
|
-
:
|
39
|
-
:
|
55
|
+
{ :type => :photo,
|
56
|
+
:media_id => '34929102',
|
57
|
+
:media_website => 'http://www.facebook.com/photo.php?pid=34929102&id=15201063',
|
58
|
+
:media_api_id => {:pid => "34929102", :uid => "15201063"}
|
59
|
+
},
|
60
|
+
'http://www.facebook.com/photo.php?pid=3343211&l=a1abf8cd37&id=322232#!/photo.php?pid=34929102&l=a1abf8cd37&id=15201063' =>
|
61
|
+
{ :type => :photo,
|
62
|
+
:media_id => '34929102',
|
63
|
+
:media_website => 'http://www.facebook.com/photo.php?pid=34929102&id=15201063',
|
64
|
+
:media_api_id => {:pid => "34929102", :uid => "15201063"}
|
65
|
+
},
|
66
|
+
'http://www.facebook.com/photo.php?pid=34929101&id=15201063#!/video/video.php?v=545993063513&subj=15201063' =>
|
67
|
+
{ :type => :video,
|
68
|
+
:media_id => '545993063513',
|
69
|
+
:media_website => "http://www.facebook.com/video/video.php?v=545993063513",
|
70
|
+
:media_api_id => {:v => '545993063513'}
|
40
71
|
}
|
41
72
|
}.each do |url, values|
|
42
73
|
describe "Facebook parse #{url}" do
|
43
74
|
before(:all) do
|
44
75
|
@a = Muri.parse url
|
45
76
|
end
|
46
|
-
|
77
|
+
if values[:type] == :photo
|
78
|
+
it_should_behave_like "Facebook parse photo"
|
79
|
+
elsif values[:type] == :video
|
80
|
+
it_should_behave_like "Facebook parse video"
|
81
|
+
end
|
47
82
|
|
48
83
|
if values[:media_id]
|
49
84
|
it "should have media id" do
|
data/test/flickr_test.rb
CHANGED
@@ -20,11 +20,11 @@ end
|
|
20
20
|
shared_examples_for "Flickr parse photo" do
|
21
21
|
it_should_behave_like "Flickr parse"
|
22
22
|
it "should have media api type = FLICKR_PHOTO" do
|
23
|
-
@a.media_api_type.should == Muri::
|
23
|
+
@a.media_api_type.should == Muri::FLICKR_MEDIA
|
24
24
|
end
|
25
25
|
|
26
|
-
it "should be flickr
|
27
|
-
@a.
|
26
|
+
it "should be flickr media" do
|
27
|
+
@a.flickr_media?.should == true
|
28
28
|
end
|
29
29
|
|
30
30
|
it "should not be facebook photo" do
|
data/test/photobucket_test.rb
CHANGED
@@ -41,9 +41,9 @@ shared_examples_for "Photobucket parse album" do
|
|
41
41
|
@a.photobucket_album?.should == true
|
42
42
|
end
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
|
44
|
+
# it "should not be facebook album" do
|
45
|
+
# @a.facebook_album?.should == false
|
46
|
+
# end
|
47
47
|
end
|
48
48
|
shared_examples_for "Photobucket parse group album" do
|
49
49
|
it_should_behave_like "Photobucket parse"
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 1.1.
|
8
|
+
- 4
|
9
|
+
version: 1.1.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- William Schneider
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-04-
|
17
|
+
date: 2010-04-29 00:00:00 -04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
@@ -28,6 +28,7 @@ extra_rdoc_files:
|
|
28
28
|
- README.textile
|
29
29
|
files:
|
30
30
|
- .gitignore
|
31
|
+
- CHANGELOG
|
31
32
|
- README.textile
|
32
33
|
- Rakefile
|
33
34
|
- VERSION.yml
|