google-video 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +1 -0
- data/CHANGELOG +3 -0
- data/README +84 -0
- data/Rakefile +49 -0
- data/TODO +14 -0
- data/examples/example.rb +40 -0
- data/examples/get-top-videos.rb +10 -0
- data/examples/get-video-details.rb +10 -0
- data/examples/search-videos.rb +10 -0
- data/lib/google-video.rb +830 -0
- data/test/test_client.rb +22 -0
- data/test/test_top_videos.rb +76 -0
- data/test/test_video_details.rb +104 -0
- data/test/test_video_search.rb +89 -0
- data/test/video_test_helper.rb +19 -0
- metadata +81 -0
data/test/test_client.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'google-video'
|
4
|
+
require File.dirname(__FILE__) + '/video_test_helper'
|
5
|
+
|
6
|
+
class TestClient < Test::Unit::TestCase
|
7
|
+
include VideoTestHelper
|
8
|
+
|
9
|
+
def test_validation
|
10
|
+
# make sure we can do basic client instantiation
|
11
|
+
assert_nothing_raised do
|
12
|
+
@client = GoogleVideo::Client.new
|
13
|
+
end
|
14
|
+
|
15
|
+
# make sure we get an error if we specify a bad host
|
16
|
+
assert_raise GoogleVideo::GoogleVideoException do
|
17
|
+
@client = GoogleVideo::Client.new :host => 'nO)domain#!badbadbad'
|
18
|
+
request = GoogleVideo::TopVideosRequest.new
|
19
|
+
@client.top_videos request
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'google-video'
|
4
|
+
require File.dirname(__FILE__) + '/video_test_helper'
|
5
|
+
|
6
|
+
class TestTopVideos < Test::Unit::TestCase
|
7
|
+
include VideoTestHelper
|
8
|
+
|
9
|
+
# the number of top videos in the list
|
10
|
+
@@TOP_VIDEOS_COUNT = 100
|
11
|
+
|
12
|
+
def setup
|
13
|
+
@client = GoogleVideo::Client.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_request_validation
|
17
|
+
# make sure an invalid country is detected
|
18
|
+
assert_raise ArgumentError do
|
19
|
+
GoogleVideo::TopVideosRequest.new(:country => 'foobarbaz')
|
20
|
+
end
|
21
|
+
|
22
|
+
# make sure the top videos method requires an appropriate request object type
|
23
|
+
assert_raise ArgumentError do
|
24
|
+
@client.top_videos 'foo'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# check the basic top video page listings
|
29
|
+
def test_top_videos
|
30
|
+
request = GoogleVideo::TopVideosRequest.new
|
31
|
+
response = @client.top_videos request
|
32
|
+
assert_valid_top_videos_response response
|
33
|
+
end
|
34
|
+
|
35
|
+
# make sure specifying a country operates properly
|
36
|
+
def test_top_videos_country
|
37
|
+
request = GoogleVideo::TopVideosRequest.new(:country => 'Brazil')
|
38
|
+
brazil_response = @client.top_videos request
|
39
|
+
assert_valid_top_videos_response brazil_response
|
40
|
+
|
41
|
+
request = GoogleVideo::TopVideosRequest.new(:country => 'Japan')
|
42
|
+
japanese_response = @client.top_videos request
|
43
|
+
assert_valid_top_videos_response japanese_response
|
44
|
+
|
45
|
+
# assume that at least one video in the japanese list will differ from the
|
46
|
+
# brazilian list, which seems like a safe bet given the number of videos
|
47
|
+
# in the list
|
48
|
+
diff = false
|
49
|
+
japanese_response.videos.each_with_index {
|
50
|
+
|jv, index| diff ||= (brazil_response.videos[index].video.doc_id != jv.video.doc_id) }
|
51
|
+
assert diff
|
52
|
+
end
|
53
|
+
|
54
|
+
def assert_valid_top_videos_response (response)
|
55
|
+
# sanity-check the result
|
56
|
+
assert_not_nil response
|
57
|
+
assert_valid_google_video_url response.request_url
|
58
|
+
assert_not_nil response.videos
|
59
|
+
assert_instance_of Array, response.videos
|
60
|
+
|
61
|
+
# make sure we got the proper number of entries
|
62
|
+
assert_equal response.videos.length, @@TOP_VIDEOS_COUNT
|
63
|
+
|
64
|
+
# validate each entry
|
65
|
+
response.videos.each { |video| assert_valid_top_video(video) }
|
66
|
+
end
|
67
|
+
|
68
|
+
def assert_valid_top_video (top_video)
|
69
|
+
assert_not_nil top_video
|
70
|
+
assert_instance_of GoogleVideo::TopVideo, top_video
|
71
|
+
assert ([0, 1, -1].include?(top_video.movement))
|
72
|
+
assert (top_video.rank_today >= 0 && top_video.rank_today <= @@TOP_VIDEOS_COUNT)
|
73
|
+
assert (top_video.rank_yesterday >= 0 && top_video.rank_yesterday <= @@TOP_VIDEOS_COUNT)
|
74
|
+
assert_valid_video(top_video.video)
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'google-video'
|
4
|
+
require File.dirname(__FILE__) + '/video_test_helper'
|
5
|
+
|
6
|
+
class TestVideoDetails < Test::Unit::TestCase
|
7
|
+
include VideoTestHelper
|
8
|
+
|
9
|
+
@@QUERY = 'christina ricci'
|
10
|
+
@@DOC_ID = 5338330163635012030
|
11
|
+
|
12
|
+
def setup
|
13
|
+
@client = GoogleVideo::Client.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_request_validation
|
17
|
+
# make sure the video details method requires an appropriate request object type
|
18
|
+
assert_raise ArgumentError do
|
19
|
+
@client.video_details 'foo'
|
20
|
+
end
|
21
|
+
|
22
|
+
# fetch a sample video for parameter testing purposes
|
23
|
+
request = GoogleVideo::VideoSearchRequest.new(:query => @@QUERY)
|
24
|
+
video = @client.video_search(request).videos.first
|
25
|
+
|
26
|
+
# make sure general and correct request construction succeeds
|
27
|
+
assert_nothing_raised do
|
28
|
+
GoogleVideo::VideoDetailsRequest.new(:doc_id => @@DOC_ID)
|
29
|
+
GoogleVideo::VideoDetailsRequest.new(:video => video)
|
30
|
+
end
|
31
|
+
|
32
|
+
# make sure an attempt to use nothing fails
|
33
|
+
assert_raise ArgumentError do
|
34
|
+
GoogleVideo::VideoDetailsRequest.new
|
35
|
+
end
|
36
|
+
|
37
|
+
# make sure an attempt to use both fails
|
38
|
+
assert_raise ArgumentError do
|
39
|
+
GoogleVideo::VideoDetailsRequest.new(:doc_id => @@DOC_ID, :video => video)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_video_details_by_video
|
44
|
+
# grab a sample video
|
45
|
+
request = GoogleVideo::VideoSearchRequest.new(:query => @@QUERY)
|
46
|
+
response = @client.video_search request
|
47
|
+
assert (response.videos && response.videos.length >= 1)
|
48
|
+
|
49
|
+
# test running a detail request on each video
|
50
|
+
response.videos.each do |video|
|
51
|
+
# look up the video's details
|
52
|
+
request = GoogleVideo::VideoDetailsRequest.new(:video => video)
|
53
|
+
response = @client.video_details request
|
54
|
+
# check it out
|
55
|
+
assert_valid_video_detail_response(response)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_video_details_by_doc_id
|
60
|
+
request = GoogleVideo::VideoDetailsRequest.new(:doc_id => @@DOC_ID)
|
61
|
+
response = @client.video_details request
|
62
|
+
assert_valid_video_detail_response(response)
|
63
|
+
end
|
64
|
+
|
65
|
+
# TODO: test the three variants of possible "durationetc" span parsing
|
66
|
+
|
67
|
+
def assert_valid_playlist_entry (entry)
|
68
|
+
assert_not_nil entry
|
69
|
+
assert_instance_of GoogleVideo::PlaylistEntry, entry
|
70
|
+
assert (entry.title && entry.title.length > 0)
|
71
|
+
assert_valid_google_video_url entry.thumbnail_image_url
|
72
|
+
assert (entry.duration && entry.duration.length > 0)
|
73
|
+
assert_match(/\d+/, entry.duration)
|
74
|
+
assert_valid_google_video_url entry.page_url
|
75
|
+
end
|
76
|
+
|
77
|
+
def assert_valid_video_frame_thumbnail (frame)
|
78
|
+
assert_not_nil frame
|
79
|
+
assert (frame.title && frame.title.length > 0)
|
80
|
+
assert_valid_google_video_url frame.thumbnail_image_url
|
81
|
+
end
|
82
|
+
|
83
|
+
def assert_valid_video_detail_response (response)
|
84
|
+
# sanity-check a couple of basic things
|
85
|
+
assert_valid_google_video_url response.request_url
|
86
|
+
video = response.video
|
87
|
+
|
88
|
+
# poke and prod the video object
|
89
|
+
assert_valid_video video
|
90
|
+
assert (video.view_count >= video.yesterday_view_count)
|
91
|
+
assert_match /http:\/\/video\.google\.com\/videogvp\/[^\.]+\.gvp\?docid=[0-9\-\+]+/, video.video_file_url
|
92
|
+
assert_kind_of Numeric, video.rank
|
93
|
+
assert_kind_of Numeric, video.rank_delta
|
94
|
+
assert_instance_of Time, video.upload_date
|
95
|
+
|
96
|
+
# check the video frame thumbnails
|
97
|
+
assert (video.video_frame_thumbnails && video.video_frame_thumbnails.length > 0)
|
98
|
+
video.video_frame_thumbnails.each { |frame| assert_valid_video_frame_thumbnail(frame) }
|
99
|
+
|
100
|
+
# check the playlist entries
|
101
|
+
assert (video.playlist_entries && video.playlist_entries.length > 0)
|
102
|
+
video.playlist_entries.each { |entry| assert_valid_playlist_entry(entry) }
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'google-video'
|
4
|
+
require File.dirname(__FILE__) + '/video_test_helper'
|
5
|
+
|
6
|
+
class TestVideoSearch < Test::Unit::TestCase
|
7
|
+
include VideoTestHelper
|
8
|
+
|
9
|
+
@@RESULTS_PER_PAGE = 10
|
10
|
+
@@QUERY_STRING = 'tessa'
|
11
|
+
@@DURATION = 'long'
|
12
|
+
@@PAGE = 2
|
13
|
+
|
14
|
+
def setup
|
15
|
+
@client = GoogleVideo::Client.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_request_validation
|
19
|
+
# make sure some general valid requests work ok
|
20
|
+
assert_nothing_raised do
|
21
|
+
GoogleVideo::VideoSearchRequest.new(:query => @@QUERY_STRING)
|
22
|
+
GoogleVideo::VideoSearchRequest.new(:query => @@QUERY_STRING, :sort => 'date')
|
23
|
+
GoogleVideo::VideoSearchRequest.new(:query => @@QUERY_STRING, :sort => 'date', :duration => 'all')
|
24
|
+
GoogleVideo::VideoSearchRequest.new(:query => @@QUERY_STRING, :duration => 'all')
|
25
|
+
GoogleVideo::VideoSearchRequest.new(:query => @@QUERY_STRING, :duration => 'all', :page => 2)
|
26
|
+
end
|
27
|
+
|
28
|
+
# make sure an invalid sort is detected
|
29
|
+
assert_raise ArgumentError do
|
30
|
+
GoogleVideo::VideoSearchRequest.new(:query => @@QUERY_STRING, :sort => 'monkey')
|
31
|
+
end
|
32
|
+
|
33
|
+
# make sure an invalid duration is detected
|
34
|
+
assert_raise ArgumentError do
|
35
|
+
GoogleVideo::VideoSearchRequest.new(:query => @@QUERY_STRING, :duration => 'el_pollo_diablo')
|
36
|
+
end
|
37
|
+
|
38
|
+
# make sure a query string is required
|
39
|
+
assert_raise ArgumentError do
|
40
|
+
GoogleVideo::VideoSearchRequest.new(:duration => 'all')
|
41
|
+
end
|
42
|
+
|
43
|
+
# make sure the video search method requires an appropriate request object
|
44
|
+
assert_raise ArgumentError do
|
45
|
+
@client.video_search "foo"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_search
|
50
|
+
request = GoogleVideo::VideoSearchRequest.new(:query => @@QUERY_STRING)
|
51
|
+
response = @client.video_search request
|
52
|
+
assert_valid_search_response response
|
53
|
+
|
54
|
+
assert_equal response.start_index, 1
|
55
|
+
assert_equal response.end_index, @@RESULTS_PER_PAGE
|
56
|
+
assert (response.total_result_count >= @@RESULTS_PER_PAGE)
|
57
|
+
assert_equal response.videos.length, @@RESULTS_PER_PAGE
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_search_duration
|
61
|
+
request = GoogleVideo::VideoSearchRequest.new(:query => @@QUERY_STRING, :duration => @@DURATION)
|
62
|
+
response = @client.video_search request
|
63
|
+
assert_valid_search_response response
|
64
|
+
|
65
|
+
assert_equal response.start_index, 1
|
66
|
+
assert_equal response.end_index, @@RESULTS_PER_PAGE
|
67
|
+
assert (response.total_result_count >= @@RESULTS_PER_PAGE)
|
68
|
+
assert_equal response.videos.length, @@RESULTS_PER_PAGE
|
69
|
+
|
70
|
+
# TODO: make sure all videos are within the specified duration
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_search_paginate
|
74
|
+
request = GoogleVideo::VideoSearchRequest.new(:query => @@QUERY_STRING, :duration => @@DURATION, :page => @@PAGE)
|
75
|
+
response = @client.video_search request
|
76
|
+
assert_valid_search_response response
|
77
|
+
|
78
|
+
assert_equal response.start_index, @@RESULTS_PER_PAGE + 1
|
79
|
+
max_result_index = @@RESULTS_PER_PAGE * @@PAGE
|
80
|
+
assert_equal response.end_index, ((response.total_result_count < max_result_index) ? response.total_result_count : max_result_index)
|
81
|
+
end
|
82
|
+
|
83
|
+
def assert_valid_search_response (response)
|
84
|
+
assert_not_nil response
|
85
|
+
assert_valid_google_video_url response.request_url
|
86
|
+
assert (response.execution_time > 0.0)
|
87
|
+
response.videos.each { |video| assert_valid_video(video) }
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module VideoTestHelper
|
2
|
+
def assert_valid_video (video)
|
3
|
+
assert_not_nil video
|
4
|
+
assert_instance_of GoogleVideo::Video, video
|
5
|
+
assert_instance_of Bignum, video.doc_id
|
6
|
+
assert_valid_google_video_url video.page_url
|
7
|
+
# we don't always have a thumbnail image, e.g. on a detail page request
|
8
|
+
if (video.thumbnail_image_url)
|
9
|
+
assert_valid_google_video_url video.thumbnail_image_url
|
10
|
+
end
|
11
|
+
assert (video.duration && video.duration.length > 0)
|
12
|
+
assert (video.rating_count >= 0)
|
13
|
+
assert (video.star_count >= 0)
|
14
|
+
end
|
15
|
+
|
16
|
+
def assert_valid_google_video_url (url)
|
17
|
+
assert(url && (url =~ /^http:\/\/video.google.com\//))
|
18
|
+
end
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.0
|
3
|
+
specification_version: 1
|
4
|
+
name: google-video
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.5.0
|
7
|
+
date: 2006-11-09 00:00:00 -08:00
|
8
|
+
summary: A Ruby object-oriented interface to Google Video content.
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: shaper@wgks.org
|
12
|
+
homepage:
|
13
|
+
rubyforge_project: google-video
|
14
|
+
description:
|
15
|
+
autorequire:
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- Walter Korman
|
31
|
+
files:
|
32
|
+
- examples/example.rb
|
33
|
+
- examples/get-top-videos.rb
|
34
|
+
- examples/get-video-details.rb
|
35
|
+
- examples/search-videos.rb
|
36
|
+
- lib/google-video.rb
|
37
|
+
- test/test_client.rb
|
38
|
+
- test/test_top_videos.rb
|
39
|
+
- test/test_video_details.rb
|
40
|
+
- test/test_video_search.rb
|
41
|
+
- test/video_test_helper.rb
|
42
|
+
- AUTHORS
|
43
|
+
- CHANGELOG
|
44
|
+
- README
|
45
|
+
- Rakefile
|
46
|
+
- TODO
|
47
|
+
test_files:
|
48
|
+
- test/test_client.rb
|
49
|
+
- test/test_top_videos.rb
|
50
|
+
- test/test_video_details.rb
|
51
|
+
- test/test_video_search.rb
|
52
|
+
rdoc_options:
|
53
|
+
- --main
|
54
|
+
- README
|
55
|
+
extra_rdoc_files:
|
56
|
+
- README
|
57
|
+
executables: []
|
58
|
+
|
59
|
+
extensions: []
|
60
|
+
|
61
|
+
requirements: []
|
62
|
+
|
63
|
+
dependencies:
|
64
|
+
- !ruby/object:Gem::Dependency
|
65
|
+
name: hpricot
|
66
|
+
version_requirement:
|
67
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: "0.4"
|
72
|
+
version:
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: htmlentities
|
75
|
+
version_requirement:
|
76
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: 3.0.1
|
81
|
+
version:
|