video_info 0.2.7 → 0.2.8
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.md +73 -52
- data/lib/provider/vimeo.rb +31 -32
- data/lib/provider/youtube.rb +46 -47
- data/lib/video_info.rb +39 -25
- data/lib/video_info/version.rb +1 -1
- metadata +16 -16
data/README.md
CHANGED
@@ -1,52 +1,73 @@
|
|
1
|
-
VideoInfo [](http://travis-ci.org/thibaudgg/video_info)
|
2
|
-
=========
|
3
|
-
|
4
|
-
Small Ruby Gem to get video info from youtube and vimeo url.
|
5
|
-
Tested against Ruby 1.8.7, 1.9.2, REE and the latest versions of JRuby & Rubinius.
|
6
|
-
|
7
|
-
Install
|
8
|
-
--------
|
9
|
-
|
10
|
-
``` bash
|
11
|
-
gem install video_info
|
12
|
-
```
|
13
|
-
|
14
|
-
Usage
|
15
|
-
-----
|
16
|
-
|
17
|
-
``` ruby
|
18
|
-
video = VideoInfo.new("http://www.youtube.com/watch?v=mZqGqE0D0n4")
|
19
|
-
|
20
|
-
# video.video_id => "mZqGqE0D0n4"
|
21
|
-
# video.provider => "YouTube"
|
22
|
-
# video.title => "Cherry Bloom - King Of The Knife"
|
23
|
-
# video.description => "The first video from the upcoming album Secret Sounds, to download in-stores April 14. Checkout http://www.cherrybloom.net"
|
24
|
-
# video.keywords => "alternative, bloom, cherry, clip, drum, guitar, king, knife, of, Paris-Forum, rock, the, tremplin"
|
25
|
-
# video.duration => 175 (in seconds)
|
26
|
-
# video.date => Sat Apr 12 22:25:35 UTC 2008
|
27
|
-
# video.thumbnail_small => "http://i.ytimg.com/vi/mZqGqE0D0n4/2.jpg"
|
28
|
-
# video.thumbnail_large => "http://i.ytimg.com/vi/mZqGqE0D0n4/0.jpg"
|
29
|
-
|
30
|
-
video = VideoInfo.new("http://vimeo.com/898029")
|
31
|
-
|
32
|
-
# video.video_id => "898029"
|
33
|
-
# video.provider => "Vimeo"
|
34
|
-
# video.title => "Cherry Bloom - King Of The Knife"
|
35
|
-
# video.description => "The first video from the upcoming album Secret Sounds, to download in-stores April 14. Checkout http://www.cherrybloom.net"
|
36
|
-
# video.keywords => "alternative, bloom, cherry, clip, drum, guitar, king, knife, of, Paris-Forum, rock, the, tremplin"
|
37
|
-
# video.duration => 175 (in seconds)
|
38
|
-
# video.date => Mon Apr 14 13:10:39 +0200 2008
|
39
|
-
# video.width => 640
|
40
|
-
# video.height => 360
|
41
|
-
# video.thumbnail_small => "http://ts.vimeo.com.s3.amazonaws.com/343/731/34373130_100.jpg"
|
42
|
-
# video.thumbnail_large => "http://ts.vimeo.com.s3.amazonaws.com/343/731/34373130_640.jpg"
|
43
|
-
|
44
|
-
video = VideoInfo.new("http://badurl.com/898029")
|
45
|
-
|
46
|
-
# video.valid? => false
|
47
|
-
```
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
1
|
+
VideoInfo [](http://travis-ci.org/thibaudgg/video_info)
|
2
|
+
=========
|
3
|
+
|
4
|
+
Small Ruby Gem to get video info from youtube and vimeo url.
|
5
|
+
Tested against Ruby 1.8.7, 1.9.2, REE and the latest versions of JRuby & Rubinius.
|
6
|
+
|
7
|
+
Install
|
8
|
+
--------
|
9
|
+
|
10
|
+
``` bash
|
11
|
+
gem install video_info
|
12
|
+
```
|
13
|
+
|
14
|
+
Usage
|
15
|
+
-----
|
16
|
+
|
17
|
+
``` ruby
|
18
|
+
video = VideoInfo.new("http://www.youtube.com/watch?v=mZqGqE0D0n4")
|
19
|
+
|
20
|
+
# video.video_id => "mZqGqE0D0n4"
|
21
|
+
# video.provider => "YouTube"
|
22
|
+
# video.title => "Cherry Bloom - King Of The Knife"
|
23
|
+
# video.description => "The first video from the upcoming album Secret Sounds, to download in-stores April 14. Checkout http://www.cherrybloom.net"
|
24
|
+
# video.keywords => "alternative, bloom, cherry, clip, drum, guitar, king, knife, of, Paris-Forum, rock, the, tremplin"
|
25
|
+
# video.duration => 175 (in seconds)
|
26
|
+
# video.date => Sat Apr 12 22:25:35 UTC 2008
|
27
|
+
# video.thumbnail_small => "http://i.ytimg.com/vi/mZqGqE0D0n4/2.jpg"
|
28
|
+
# video.thumbnail_large => "http://i.ytimg.com/vi/mZqGqE0D0n4/0.jpg"
|
29
|
+
|
30
|
+
video = VideoInfo.new("http://vimeo.com/898029")
|
31
|
+
|
32
|
+
# video.video_id => "898029"
|
33
|
+
# video.provider => "Vimeo"
|
34
|
+
# video.title => "Cherry Bloom - King Of The Knife"
|
35
|
+
# video.description => "The first video from the upcoming album Secret Sounds, to download in-stores April 14. Checkout http://www.cherrybloom.net"
|
36
|
+
# video.keywords => "alternative, bloom, cherry, clip, drum, guitar, king, knife, of, Paris-Forum, rock, the, tremplin"
|
37
|
+
# video.duration => 175 (in seconds)
|
38
|
+
# video.date => Mon Apr 14 13:10:39 +0200 2008
|
39
|
+
# video.width => 640
|
40
|
+
# video.height => 360
|
41
|
+
# video.thumbnail_small => "http://ts.vimeo.com.s3.amazonaws.com/343/731/34373130_100.jpg"
|
42
|
+
# video.thumbnail_large => "http://ts.vimeo.com.s3.amazonaws.com/343/731/34373130_640.jpg"
|
43
|
+
|
44
|
+
video = VideoInfo.new("http://badurl.com/898029")
|
45
|
+
|
46
|
+
# video.valid? => false
|
47
|
+
```
|
48
|
+
|
49
|
+
Options
|
50
|
+
-------
|
51
|
+
|
52
|
+
``` ruby
|
53
|
+
video = VideoInfo.new("http://www.youtube.com/watch?v=mZqGqE0D0n4", "User-Agent" => "My Youtube Mashup Robot/1.0")
|
54
|
+
video = VideoInfo.new("http://www.youtube.com/watch?v=mZqGqE0D0n4", "Referer" => "http://my-youtube-mashup.com/")
|
55
|
+
video = VideoInfo.new("http://www.youtube.com/watch?v=mZqGqE0D0n4", "Referer" => "http://my-youtube-mashup.com/",
|
56
|
+
"User-Agent" => "My Youtube Mashup Robot/1.0")
|
57
|
+
```
|
58
|
+
You can also use **symbols** instead of strings (any non-word (`/[^a-z]/i`) character would be converted to hyphen).
|
59
|
+
|
60
|
+
``` ruby
|
61
|
+
video = VideoInfo.new("http://www.youtube.com/watch?v=mZqGqE0D0n4", :referer => "http://my-youtube-mashup.com/",
|
62
|
+
:user_agent => "My Youtube Mashup Robot/1.0")
|
63
|
+
```
|
64
|
+
|
65
|
+
User-Agent when empty defaults to "VideoInfo/VERSION" - where version is current VideoInfo version, e.g. **"VideoInfo/0.2.7"**.
|
66
|
+
|
67
|
+
It supports all openURI header fields (options), for more information see: [openURI DOCS](http://www.ruby-doc.org/stdlib-1.9.3/libdoc/open-uri/rdoc/OpenURI.html)
|
68
|
+
|
69
|
+
|
70
|
+
Author
|
71
|
+
------
|
72
|
+
|
73
|
+
[Thibaud Guillaume-Gentil](https://github.com/thibaudgg) ([@thibaudgg](http://twitter.com/thibaudgg))
|
data/lib/provider/vimeo.rb
CHANGED
@@ -1,33 +1,32 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
:
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
@video_id
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
@
|
20
|
-
@
|
21
|
-
@
|
22
|
-
@
|
23
|
-
@
|
24
|
-
@
|
25
|
-
@
|
26
|
-
@
|
27
|
-
@
|
28
|
-
@
|
29
|
-
@
|
30
|
-
|
31
|
-
|
32
|
-
|
1
|
+
class Vimeo
|
2
|
+
attr_accessor :video_id, :url, :provider, :title, :description, :keywords,
|
3
|
+
:duration, :date, :width, :height,
|
4
|
+
:thumbnail_small, :thumbnail_large,
|
5
|
+
:view_count,
|
6
|
+
:openURI_options
|
7
|
+
|
8
|
+
def initialize(url, options = {})
|
9
|
+
@openURI_options = options
|
10
|
+
@video_id = url.gsub(/.*\.com\/(?:groups\/[^\/]+\/videos\/)?([0-9]+).*$/i, '\1')
|
11
|
+
get_info unless @video_id == url
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def get_info
|
17
|
+
doc = Hpricot(open("http://vimeo.com/api/v2/video/#{@video_id}.xml", @openURI_options))
|
18
|
+
@provider = "Vimeo"
|
19
|
+
@url = doc.search("url").inner_text
|
20
|
+
@title = doc.search("title").inner_text
|
21
|
+
@description = doc.search("description").inner_text
|
22
|
+
@keywords = doc.search("tags").inner_text
|
23
|
+
@duration = doc.search("duration").inner_text.to_i # seconds
|
24
|
+
@width = doc.search("width").inner_text.to_i
|
25
|
+
@height = doc.search("height").inner_text.to_i
|
26
|
+
@date = Time.parse(doc.search("upload_date").inner_text, Time.now.utc).utc
|
27
|
+
@thumbnail_small = doc.search("thumbnail_small").inner_text
|
28
|
+
@thumbnail_large = doc.search("thumbnail_large").inner_text
|
29
|
+
@view_count = doc.search("stats_number_of_plays").inner_text.to_i
|
30
|
+
end
|
31
|
+
|
33
32
|
end
|
data/lib/provider/youtube.rb
CHANGED
@@ -1,47 +1,46 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
:
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
@
|
30
|
-
@
|
31
|
-
@
|
32
|
-
@
|
33
|
-
@
|
34
|
-
@
|
35
|
-
@
|
36
|
-
@
|
37
|
-
|
38
|
-
#
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
1
|
+
class Youtube
|
2
|
+
attr_accessor :video_id, :url, :provider, :title, :description, :keywords,
|
3
|
+
:duration, :date, :width, :height,
|
4
|
+
:thumbnail_small, :thumbnail_large,
|
5
|
+
:view_count,
|
6
|
+
:openURI_options
|
7
|
+
|
8
|
+
def initialize(url, options = {})
|
9
|
+
@openURI_options = options
|
10
|
+
video_id_for(url)
|
11
|
+
get_info unless @video_id == url
|
12
|
+
end
|
13
|
+
|
14
|
+
def regex
|
15
|
+
/http:\/\/(www.)?youtube\.com\/watch\?v=([A-Za-z0-9._%-]*)(\&\S+)?|http:\/\/(www.)?youtu\.be\/([A-Za-z0-9._%-]*)?/
|
16
|
+
end
|
17
|
+
|
18
|
+
def video_id_for(url)
|
19
|
+
url.gsub(regex) do
|
20
|
+
@video_id = $2 || $5
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def get_info
|
27
|
+
doc = Hpricot(open("http://gdata.youtube.com/feeds/api/videos/#{@video_id}", @openURI_options))
|
28
|
+
@provider = "YouTube"
|
29
|
+
@url = "http://www.youtube.com/watch?v=#{@video_id}"
|
30
|
+
@title = doc.search("media:title").inner_text
|
31
|
+
@description = doc.search("media:description").inner_text
|
32
|
+
@keywords = doc.search("media:keywords").inner_text
|
33
|
+
@duration = doc.search("yt:duration").first[:seconds].to_i
|
34
|
+
@date = Time.parse(doc.search("published").inner_text, Time.now.utc)
|
35
|
+
@thumbnail_small = doc.search("media:thumbnail").min { |a,b| a[:height].to_i * a[:width].to_i <=> b[:height].to_i * b[:width].to_i }[:url]
|
36
|
+
@thumbnail_large = doc.search("media:thumbnail").max { |a,b| a[:height].to_i * a[:width].to_i <=> b[:height].to_i * b[:width].to_i }[:url]
|
37
|
+
# when your video still has no view, yt:statistics is not returned by Youtube
|
38
|
+
# see: https://github.com/thibaudgg/video_info/issues#issue/2
|
39
|
+
if doc.search("yt:statistics").first
|
40
|
+
@view_count = doc.search("yt:statistics").first[:viewcount].to_i
|
41
|
+
else
|
42
|
+
@view_count = 0
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
data/lib/video_info.rb
CHANGED
@@ -1,25 +1,39 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
1
|
+
require 'open-uri'
|
2
|
+
require 'hpricot'
|
3
|
+
require 'video_info/version'
|
4
|
+
require 'provider/vimeo'
|
5
|
+
require 'provider/youtube'
|
6
|
+
|
7
|
+
class VideoInfo
|
8
|
+
|
9
|
+
def initialize(url, options = {})
|
10
|
+
|
11
|
+
options = { "User-Agent" => "VideoInfo/#{VideoInfoVersion::VERSION}" }.merge options
|
12
|
+
options.dup.each do |key,value|
|
13
|
+
unless OpenURI::Options.keys.include? key
|
14
|
+
if key.is_a? Symbol
|
15
|
+
options[key.to_s.split(/[^a-z]/i).map(&:capitalize).join('-')] = value
|
16
|
+
options.delete key
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
case url
|
22
|
+
when /vimeo\.com/
|
23
|
+
@video = Vimeo.new(url, options)
|
24
|
+
when /youtube\.com/
|
25
|
+
@video = Youtube.new(url, options)
|
26
|
+
when /youtu\.be/
|
27
|
+
@video = Youtube.new(url, options)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def valid?
|
32
|
+
@video != nil && !["", nil].include?(title)
|
33
|
+
end
|
34
|
+
|
35
|
+
def method_missing(sym, *args, &block)
|
36
|
+
@video.send sym, *args, &block
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
data/lib/video_info/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: video_info
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-11-
|
12
|
+
date: 2011-11-20 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: hpricot
|
16
|
-
requirement: &
|
16
|
+
requirement: &70141481121100 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.8.4
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70141481121100
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: bundler
|
27
|
-
requirement: &
|
27
|
+
requirement: &70141481120500 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70141481120500
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &70141481119200 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 2.7.0
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70141481119200
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: guard-rspec
|
49
|
-
requirement: &
|
49
|
+
requirement: &70141481118360 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70141481118360
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: webmock
|
60
|
-
requirement: &
|
60
|
+
requirement: &70141481117300 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70141481117300
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: vcr
|
71
|
-
requirement: &
|
71
|
+
requirement: &70141481116600 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,7 +76,7 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70141481116600
|
80
80
|
description: Get video info from youtube and vimeo url.
|
81
81
|
email:
|
82
82
|
- thibaud@thibaud.me
|
@@ -104,7 +104,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
104
104
|
version: '0'
|
105
105
|
segments:
|
106
106
|
- 0
|
107
|
-
hash: -
|
107
|
+
hash: -2856754979042863161
|
108
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
109
|
none: false
|
110
110
|
requirements:
|
@@ -113,7 +113,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
113
113
|
version: '0'
|
114
114
|
segments:
|
115
115
|
- 0
|
116
|
-
hash: -
|
116
|
+
hash: -2856754979042863161
|
117
117
|
requirements: []
|
118
118
|
rubyforge_project: video_info
|
119
119
|
rubygems_version: 1.8.9
|