acts_as_unvlogable_2 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,77 @@
1
+ # ----------------------------------------------
2
+ # Class for Metacafe (www.metacafe.com)
3
+ # http://www.metacafe.com/watch/476621/experiments_with_the_myth_busters_with_diet_coke_and_mentos_dry/
4
+ # ----------------------------------------------
5
+
6
+
7
+ class VgMetacafe
8
+
9
+ def initialize(url=nil, options={})
10
+ @url = url
11
+ @args = parse_url(url)
12
+
13
+ #is the video 'youtubed'?
14
+ @youtubed = @args[1].index("yt-").nil? ? false : true
15
+ @yt = @youtubed ? VgYoutube.new("http://www.youtube.com/watch?v=#{@args[1].sub('yt-', '')}") : nil
16
+ end
17
+
18
+ def title
19
+ @youtubed ? @yt.title : (@args[2].humanize unless @args[2].blank?)
20
+ end
21
+
22
+ def thumbnail
23
+ "http://www.metacafe.com/thumb/#{@args[1]}.jpg"
24
+ end
25
+
26
+ def embed_url
27
+ "http://www.metacafe.com/fplayer/#{@args[1]}/#{@args[2]}.swf"
28
+ end
29
+
30
+ def embed_html(width=425, height=344, options={}, params={})
31
+ "<embed src='#{embed_url}' width='#{width}' height='#{height}' wmode='transparent' pluginspage='http://www.macromedia.com/go/getflashplayer' type='application/x-shockwave-flash'></embed>"
32
+ end
33
+
34
+ def flv
35
+ if @youtubed
36
+ @yt.flv
37
+ else
38
+ params = Hash.new
39
+ open(self.embed_url) {|f|
40
+ params = CGI::parse(f.base_uri.request_uri.split("?")[1])
41
+ }
42
+ CGI::unescape "#{ params['mediaURL']}?__gda__=#{params['gdaKey']}"
43
+ end
44
+ end
45
+
46
+ def duration
47
+ nil
48
+ end
49
+
50
+ def download_url
51
+ nil
52
+ end
53
+
54
+ def service
55
+ "Metacafe"
56
+ end
57
+
58
+ private
59
+
60
+ def parse_url(url)
61
+ uri = URI.parse(url)
62
+ path = uri.path
63
+ @args = ''
64
+ if path and path.split("/").size >=1
65
+ @args = path.split("/")
66
+ @args.delete("watch")
67
+
68
+ raise unless @args.size > 0
69
+ else
70
+ raise
71
+ end
72
+ @args
73
+ rescue
74
+ nil
75
+ end
76
+
77
+ end
@@ -0,0 +1,48 @@
1
+ # ----------------------------------------------
2
+ # Class for Myspace (vids.myspace.com)
3
+ # http://vids.myspace.com/index.cfm?fuseaction=vids.individual&VideoID=27111431
4
+ # ----------------------------------------------
5
+
6
+
7
+ class VgMyspace
8
+
9
+ def initialize(url=nil, options={})
10
+ @url = url
11
+ @video_id = @url.query_param('videoid').blank? ? @url.query_param('VideoID') : @url.query_param('videoid')
12
+ res = Net::HTTP.get(URI.parse("http://mediaservices.myspace.com/services/rss.ashx?type=video&videoID=#{@video_id}"))
13
+ @feed = REXML::Document.new(res)
14
+ end
15
+
16
+ def title
17
+ REXML::XPath.first(@feed, "//item/title")[0].to_s
18
+ end
19
+
20
+ def thumbnail
21
+ REXML::XPath.first(@feed, "//media:thumbnail").attributes['url']
22
+ end
23
+
24
+ def duration
25
+ nil
26
+ end
27
+
28
+ def embed_url
29
+ "http://lads.myspace.com/videos/vplayer.swf?m=#{REXML::XPath.first( @feed, "//myspace:itemID" )[0]}&v=2&type=video"
30
+ end
31
+
32
+ def embed_html(width=425, height=344, options={}, params={})
33
+ "<embed src='#{embed_url}' type='application/x-shockwave-flash' width='#{width}' height='#{height}'></embed>"
34
+ end
35
+
36
+ def flv
37
+ REXML::XPath.first(@feed, "//media:content").attributes['url']
38
+ end
39
+
40
+ def download_url
41
+ nil
42
+ end
43
+
44
+ def service
45
+ "Myspace"
46
+ end
47
+
48
+ end
@@ -0,0 +1,46 @@
1
+ # ----------------------------------------------
2
+ # Class for prostopleer.com
3
+ # http://prostopleer.com/tracks/401758bI6n
4
+ # ----------------------------------------------
5
+
6
+ require 'hpricot'
7
+
8
+ class VgProstopleer
9
+
10
+ attr_accessor :track_id
11
+
12
+ def initialize(url, options={})
13
+ @uri = URI.parse(url)
14
+ @track_id = @uri.path.match(/tracks\/([\w\d]+)/)[1]
15
+ @url = url
16
+ raise ArgumentError unless @track_id
17
+ end
18
+
19
+ def title
20
+ @title ||= [pp_data[:singer], pp_data[:song]].join(' - ')
21
+ end
22
+
23
+ def embed_html(width=425, height=344, options={}, params={})
24
+ return "<object width=\"#{width}\" height=\"#{height}\"><param name=\"movie\" value=\"http://embed.prostopleer.com/track?id=#{track_id}\"></param><embed src=\"http://embed.prostopleer.com/track?id=#{track_id}\" type=\"application/x-shockwave-flash\" width=\"#{width}\" height=\"#{height}\"></embed></object>"
25
+ end
26
+
27
+ def service
28
+ "ProstoPleer"
29
+ end
30
+
31
+ private
32
+ def pp_data
33
+ return @pp_data if defined? @pp_data
34
+ hp = Hpricot.parse(Net::HTTP.get(@uri))
35
+ info = (hp/'li[@singer]').first
36
+ @pp_data = {
37
+ :singer => info['singer'], # artist name
38
+ :song => info['song'], # song title
39
+ :file_id => info['file_id'], # wtf
40
+ :link => info['link'], # same as @track_id
41
+ :duration => info['duration'], # duration of the song in seconds
42
+ :size => info['size'], # file size
43
+ :rate => info['rate'] # bit rate
44
+ }
45
+ end
46
+ end
@@ -0,0 +1,64 @@
1
+ # ----------------------------------------------
2
+ # Class for Qik (qik.com)
3
+ # http://qik.com/video/340982
4
+ # ----------------------------------------------
5
+
6
+
7
+ class VgQik
8
+
9
+ def initialize(url=nil, options={})
10
+ @url = url
11
+ @video_id = parse_url(url)
12
+ h = {"Content-Type" => "application/json"}
13
+ @page = Net::HTTP.start("engine.qik.com", "80") do |connection|
14
+ JSON.parse(connection.post("/api/jsonrpc?apikey=e53d41680124e6d0", {:method => "qik.stream.public_info", :params => [340982]}.to_json, h).body)
15
+ end
16
+ end
17
+
18
+ def title
19
+ @page[0]['title']
20
+ end
21
+
22
+ def thumbnail
23
+ @page[0]['large_thumbnail_url']
24
+ end
25
+
26
+ def embed_url
27
+ "http://qik.com/swfs/qikPlayer5.swf?streamID=#{@page[0]['embed_html'].split("streamID=")[1].split("&")[0]}&amp;autoplay=false"
28
+ end
29
+
30
+ def embed_html(width=425, height=344, options={}, params={})
31
+ @page[0]['embed_html']
32
+ end
33
+
34
+ def flv
35
+ "http://media.qik.com/vod/flvs-play?assetId=#{@page[0]['embed_html'].split("streamID=")[1].split("&")[0]}&profile=flvs-normal"
36
+ end
37
+
38
+ def download_url
39
+ nil
40
+ end
41
+
42
+ def duration
43
+ nil
44
+ end
45
+
46
+ def service
47
+ "Qik"
48
+ end
49
+
50
+ protected
51
+
52
+ def parse_url(url)
53
+ video_id = nil
54
+ if url.split('#').size > 1
55
+ pieces = url.split(/#|=/)
56
+ hash = Hash[*pieces]
57
+ video_id = hash['v']
58
+ else
59
+ video_id = url.split("/")[4]
60
+ end
61
+ video_id
62
+ end
63
+
64
+ end
@@ -0,0 +1,80 @@
1
+ class VgRutube
2
+
3
+ def initialize(url=nil, options={})
4
+ @url = url
5
+ parse_url(url)
6
+ end
7
+
8
+ def title
9
+ rt_info["movie"][0]["title"][0].strip
10
+ end
11
+
12
+ # this method of extraction is somewhat fragile to changes in RuTube urls
13
+ # more correct way would be using rt_info structure, like it was done in title()
14
+ def thumbnail
15
+ # size=1 gives bigger thumbnail.
16
+ # I'm not sure how to add size parameter in compatible way
17
+ size = 2
18
+ "http://img.rutube.ru/thumbs/#{movie_hash[0,2]}/#{movie_hash[2,2]}/#{movie_hash}-#{size}.jpg"
19
+ end
20
+
21
+ def embed_url
22
+ # path to swf
23
+ "http://video.rutube.ru/#{movie_hash}"
24
+ end
25
+
26
+ def embed_html(width=425, height=344, options={}, params={})
27
+ # overridden cause we have to change default size if needed
28
+ return <<-"END"
29
+ <object width="#{width}" height="#{height}"><param
30
+ name="movie" value="#{embed_url}"></param><param
31
+ name="wmode" value="window"></param><param
32
+ name="allowFullScreen" value="true"></param><embed
33
+ src="#{embed_url}" type="application/x-shockwave-flash"
34
+ wmode="window" width="#{width}" height="#{height}"
35
+ allowFullScreen="true"></embed>
36
+ </object>
37
+ END
38
+ end
39
+
40
+ def flv
41
+ # Fragile, untested, issues one redirect to actual location
42
+ # can't be extracted from rt_info
43
+ "http://bl.rutube.ru/#{movie_hash}.iflv"
44
+ end
45
+
46
+ def download_url
47
+ nil
48
+ end
49
+
50
+ def duration
51
+ nil
52
+ end
53
+
54
+ def service
55
+ "Rutube"
56
+ end
57
+
58
+ private
59
+
60
+ attr_accessor :movie_id
61
+ RT_XML_API = "http://rutube.ru/cgi-bin/xmlapi.cgi"
62
+
63
+ def movie_hash
64
+ @movie_hash ||= rt_info["movie"][0]["playerLink"][0].match( %r{[a-f0-9]+$} )[0]
65
+ end
66
+
67
+ def rt_info
68
+ url = RT_XML_API + "?rt_movie_id=#{movie_id}&rt_mode=movie"
69
+ @rt_info ||= XmlSimple.xml_in( Net::HTTP.get_response( URI.parse(url) ).body )
70
+ end
71
+
72
+ def parse_url(url)
73
+ uri = URI.parse(url)
74
+ @movie_id = uri.path.match(/\d+/)[0]
75
+ # this doesn't work reliably:
76
+ # @movie_hash = uri.query.match(/(^|&)v=([^&]+)/)[2]
77
+ # we'll cut it from rt_info instead
78
+ end
79
+
80
+ end
@@ -0,0 +1,51 @@
1
+ # ----------------------------------------------
2
+ # Class for Ted Talks (www.ted.com/talks)
3
+ # http://www.ted.com/talks/benjamin_wallace_on_the_price_of_happiness.html
4
+ # ----------------------------------------------
5
+
6
+
7
+ class VgTed
8
+
9
+ def initialize(url=nil, options={})
10
+ @url = url
11
+ raise unless URI::parse(url).path.split("/").include? "talks"
12
+ @page = Hpricot(open(url))
13
+ id = @page.to_s.split("ted id=")[1].split("\]")[0]
14
+ @emb = Hpricot(open("http://www.ted.com/talks/embed/id/#{id}"))
15
+ @flashvars = CGI::unescapeHTML(@emb.to_s).split("param name=\"flashvars\" value=\"")[1].split("\"")[0]
16
+ @args = CGI::parse(@flashvars)
17
+ end
18
+
19
+ def title
20
+ @page.search("//h1/span").first.inner_html.strip
21
+ end
22
+
23
+ def thumbnail
24
+ "#{@args['su']}"
25
+ end
26
+
27
+ def duration
28
+ nil
29
+ end
30
+
31
+ def embed_url
32
+ "http://video.ted.com/assets/player/swf/EmbedPlayer.swf?#{@flashvars}"
33
+ end
34
+
35
+ def embed_html(width=425, height=344, options={}, params={})
36
+ "<object width='#{width}' height='#{height}'><param name='movie' value='#{embed_url}'></param><param name='allowFullScreen' value='true' /><param name='wmode' value='transparent'></param><param name='bgColor' value='#ffffff'></param><embed src='#{embed_url}' pluginspace='http://www.macromedia.com/go/getflashplayer' type='application/x-shockwave-flash' wmode='transparent' bgColor='#ffffff' width='#{width}' height='#{height}' allowFullScreen='true'></embed></object>"
37
+ end
38
+
39
+ def flv
40
+ "#{@args['vu'].to_s}"
41
+ end
42
+
43
+ def download_url
44
+ nil
45
+ end
46
+
47
+ def service
48
+ "Ted Talks"
49
+ end
50
+
51
+ end
@@ -0,0 +1,89 @@
1
+ # ----------------------------------------------
2
+ # Class for Vimeo (vimeo.com)
3
+ # http://vimeo.com/5362441
4
+ # ----------------------------------------------
5
+
6
+
7
+ class VgVimeo
8
+
9
+ def initialize(url=nil, options={})
10
+ # general settings
11
+ @url = url
12
+ @video_id = parse_url(url)
13
+
14
+ if !(@vimeo_id =~ /^[0-9]+$/)
15
+ r = Net::HTTP.get_response(URI.parse(url))
16
+
17
+ if r.code == "301"
18
+ @url = "http://vimeo.com#{r.header['location']}"
19
+ @video_id = parse_url(@url)
20
+ end
21
+ end
22
+
23
+ res = Net::HTTP.get(URI.parse("http://vimeo.com/api/v2/video/#{@video_id}.xml"))
24
+ @feed = REXML::Document.new(res)
25
+ end
26
+
27
+ def video_id
28
+ @video_id
29
+ end
30
+
31
+ def title
32
+ REXML::XPath.first( @feed, "//title" )[0].to_s
33
+ end
34
+
35
+ def thumbnail
36
+ REXML::XPath.first( @feed, "//thumbnail_medium" )[0].to_s
37
+ end
38
+
39
+ def duration
40
+ REXML::XPath.first( @feed, "//duration" )[0].to_s.to_i
41
+ end
42
+
43
+ def embed_url
44
+ "http://vimeo.com/moogaloop.swf?clip_id=#{@video_id}&amp;force_embed=1&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=1&amp;color=ffffff&amp;fullscreen=1&amp;autoplay=0&amp;loop=0"
45
+ end
46
+
47
+ def embed_html(width=425, height=344, options={}, params={})
48
+ "<object width='#{width}' height='#{height}'><param name='movie' value='#{embed_url}'></param><param name='allowFullScreen' value='true'></param><param name='allowscriptaccess' value='always'></param><embed src='#{embed_url}' type='application/x-shockwave-flash' allowscriptaccess='always' allowfullscreen='true' width='#{width}' height='#{height}'></embed></object>"
49
+ end
50
+
51
+ def flv
52
+ res = Net::HTTP.get(URI.parse("http://vimeo.com/42966264?action=download"))
53
+ request_signature = res.split("\"signature\":\"")[1].split("\"")[0]
54
+ request_cached_timestamp = res.split("\"cached_timestamp\":")[1].split(",")[0]
55
+ "http://player.vimeo.com/play_redirect?clip_id=#{@video_id}&sig=#{request_signature}&time=#{request_cached_timestamp}&quality=sd&codecs=H264,VP8,VP6&type=moogaloop&embed_location="
56
+ end
57
+
58
+ def download_url
59
+ request_signature = REXML::XPath.first( @feed, "//request_signature" )[0]
60
+ request_signature_expires = REXML::XPath.first( @feed, "//request_signature_expires" )[0]
61
+ "http://www.vimeo.com/moogaloop/play/clip:#{@video_id}/#{request_signature}/#{request_signature_expires}/?q=hd"
62
+ end
63
+
64
+ def service
65
+ "Vimeo"
66
+ end
67
+
68
+ protected
69
+
70
+ # formats: http://vimeo.com/<video_id> or http://vimeo.com/channels/hd#<video_id>
71
+ def parse_url(url)
72
+ uri = URI.parse(url)
73
+ path = uri.path
74
+ videoargs = ''
75
+
76
+ return uri.fragment if uri.fragment
77
+
78
+ if uri.path and path.split("/").size > 0
79
+ videoargs = path.split("/")
80
+ raise unless videoargs.size > 0
81
+ else
82
+ raise
83
+ end
84
+ videoargs[1]
85
+ rescue
86
+ nil
87
+ end
88
+
89
+ end