kappa 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +35 -23
- data/lib/kappa.rb +2 -1
- data/lib/kappa/channel.rb +100 -27
- data/lib/kappa/configuration.rb +54 -0
- data/lib/kappa/connection.rb +22 -39
- data/lib/kappa/game.rb +43 -20
- data/lib/kappa/id_equality.rb +1 -1
- data/lib/kappa/images.rb +11 -1
- data/lib/kappa/query.rb +22 -0
- data/lib/kappa/stream.rb +69 -47
- data/lib/kappa/team.rb +50 -28
- data/lib/kappa/user.rb +56 -33
- data/lib/kappa/version.rb +2 -2
- data/lib/kappa/video.rb +61 -39
- metadata +8 -6
- data/lib/kappa/twitch.rb +0 -13
data/lib/kappa/team.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'time'
|
2
2
|
|
3
|
-
module
|
3
|
+
module Twitch::V2
|
4
4
|
# Teams are an organization of channels.
|
5
|
-
# @see
|
5
|
+
# @see Teams#get Teams#get
|
6
|
+
# @see Teams#all Teams#all
|
6
7
|
# @see Teams
|
7
8
|
# @see Channel
|
8
9
|
class Team
|
9
|
-
include
|
10
|
-
include Kappa::IdEquality
|
10
|
+
include Twitch::IdEquality
|
11
11
|
|
12
12
|
# @private
|
13
13
|
def initialize(hash)
|
@@ -23,74 +23,96 @@ module Kappa::V2
|
|
23
23
|
@url = "http://www.twitch.tv/team/#{@name}"
|
24
24
|
end
|
25
25
|
|
26
|
-
#
|
27
|
-
#
|
28
|
-
# @return [Team] A valid `Team` object if the team exists, `nil` otherwise.
|
29
|
-
# @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/teams.md#get-teamsteam GET /teams/:team
|
30
|
-
def self.get(team_name)
|
31
|
-
json = connection.get("teams/#{team_name}")
|
32
|
-
if json['status'] == 404
|
33
|
-
nil
|
34
|
-
else
|
35
|
-
new(json)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
26
|
+
# @example
|
27
|
+
# 12
|
39
28
|
# @return [Fixnum] Unique Twitch ID.
|
40
29
|
attr_reader :id
|
41
30
|
|
31
|
+
# @example
|
32
|
+
# "TeamLiquid is awesome. and esports. video games. \n\n"
|
42
33
|
# @return [String] Info about the team. This is displayed on the team's page and can contain HTML.
|
43
34
|
attr_reader :info
|
44
35
|
|
36
|
+
# @example
|
37
|
+
# "http://static-cdn.jtvnw.net/jtv_user_pictures/team-eg-background_image-da36973b6d829ac6.png"
|
45
38
|
# @return [String] URL for background image.
|
46
39
|
attr_reader :background_url
|
47
40
|
|
41
|
+
# @example
|
42
|
+
# "http://static-cdn.jtvnw.net/jtv_user_pictures/team-eg-banner_image-1ad9c4738f4698b1-640x125.png"
|
48
43
|
# @return [String] URL for banner image.
|
49
44
|
attr_reader :banner_url
|
50
45
|
|
46
|
+
# @example
|
47
|
+
# "http://static-cdn.jtvnw.net/jtv_user_pictures/team-eg-team_logo_image-9107b874d4c3fc3b-300x300.jpeg"
|
51
48
|
# @return [String] URL for the logo image.
|
52
49
|
attr_reader :logo_url
|
53
50
|
|
51
|
+
# @example
|
52
|
+
# "teamliquid"
|
53
|
+
# @see #display_name
|
54
54
|
# @return [String] Unique Twitch name.
|
55
55
|
attr_reader :name
|
56
56
|
|
57
|
+
# @example
|
58
|
+
# "TeamLiquid"
|
59
|
+
# @see #name
|
57
60
|
# @return [String] User-friendly display name. This name is used for the team's page title.
|
58
61
|
attr_reader :display_name
|
59
62
|
|
63
|
+
# @example
|
64
|
+
# 2013-05-24 00:17:10 UTC
|
60
65
|
# @return [Time] When the team was last updated (UTC).
|
61
66
|
attr_reader :updated_at
|
62
67
|
|
68
|
+
# @example
|
69
|
+
# 2011-10-27 01:00:44 UTC
|
63
70
|
# @return [Time] When the team was created (UTC).
|
64
71
|
attr_reader :created_at
|
65
72
|
|
66
73
|
# @example
|
67
|
-
# "http://www.twitch.tv/team/
|
74
|
+
# "http://www.twitch.tv/team/teamliquid"
|
68
75
|
# @return [String] URL for the team's Twitch landing page.
|
69
76
|
attr_reader :url
|
70
77
|
end
|
71
78
|
|
72
|
-
# Query class
|
79
|
+
# Query class for finding all active teams.
|
73
80
|
# @see Team
|
74
81
|
class Teams
|
75
|
-
|
82
|
+
# @private
|
83
|
+
def initialize(query)
|
84
|
+
@query = query
|
85
|
+
end
|
86
|
+
|
87
|
+
# Get a team by name.
|
88
|
+
# @example
|
89
|
+
# Twitch.teams.get('teamliquid')
|
90
|
+
# @param team_name [String] The name of the team to get.
|
91
|
+
# @return [Team] A valid `Team` object if the team exists, `nil` otherwise.
|
92
|
+
# @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/teams.md#get-teamsteam GET /teams/:team
|
93
|
+
def get(team_name)
|
94
|
+
json = @query.connection.get("teams/#{team_name}")
|
95
|
+
if json['status'] == 404
|
96
|
+
nil
|
97
|
+
else
|
98
|
+
Team.new(json)
|
99
|
+
end
|
100
|
+
end
|
76
101
|
|
77
102
|
# Get the list of all active teams.
|
78
103
|
# @example
|
79
|
-
#
|
104
|
+
# Twitch.teams.all
|
80
105
|
# @example
|
81
|
-
#
|
106
|
+
# Twitch.teams.all(:limit => 10)
|
82
107
|
# @param options [Hash] Filter criteria.
|
83
108
|
# @option options [Fixnum] :limit (none) Limit on the number of results returned.
|
84
109
|
# @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/teams.md#get-teams GET /teams
|
85
110
|
# @return [Array<Team>] List of all active teams.
|
86
|
-
def
|
87
|
-
|
88
|
-
|
89
|
-
return connection.accumulate(
|
111
|
+
def all(options = {})
|
112
|
+
return @query.connection.accumulate(
|
90
113
|
:path => 'teams',
|
91
|
-
:params => params,
|
92
114
|
:json => 'teams',
|
93
|
-
:
|
115
|
+
:create => Team,
|
94
116
|
:limit => options[:limit],
|
95
117
|
:offset => options[:offset]
|
96
118
|
)
|
data/lib/kappa/user.rb
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
require 'cgi'
|
2
2
|
require 'time'
|
3
3
|
|
4
|
-
module
|
4
|
+
module Twitch::V2
|
5
5
|
# These are members of the Twitch community who have a Twitch account. If broadcasting,
|
6
6
|
# they can own a stream that they can broadcast on their channel. If mainly viewing,
|
7
7
|
# they might follow or subscribe to channels.
|
8
|
-
# @see
|
8
|
+
# @see Users#get Users#get
|
9
|
+
# @see Users
|
9
10
|
# @see Channel
|
10
11
|
# @see Stream
|
11
12
|
class User
|
12
|
-
include
|
13
|
-
include Kappa::IdEquality
|
13
|
+
include Twitch::IdEquality
|
14
14
|
|
15
15
|
# @private
|
16
|
-
def initialize(hash)
|
16
|
+
def initialize(hash, query)
|
17
|
+
@query = query
|
17
18
|
@id = hash['_id']
|
18
19
|
@created_at = Time.parse(hash['created_at']).utc
|
19
20
|
@display_name = hash['display_name']
|
@@ -23,26 +24,12 @@ module Kappa::V2
|
|
23
24
|
@updated_at = Time.parse(hash['updated_at']).utc
|
24
25
|
end
|
25
26
|
|
26
|
-
# Get a user by name.
|
27
|
-
# @param user_name [String] The name of the user to get. This is the same as the channel or stream name.
|
28
|
-
# @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/users.md#get-usersuser GET /users/:user
|
29
|
-
# @return [User] A valid `User` object if the user exists, `nil` otherwise.
|
30
|
-
def self.get(user_name)
|
31
|
-
encoded_name = CGI.escape(user_name)
|
32
|
-
json = connection.get("users/#{encoded_name}")
|
33
|
-
if !json || json['status'] == 404
|
34
|
-
nil
|
35
|
-
else
|
36
|
-
new(json)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
27
|
# Get the `Channel` associated with this user.
|
41
28
|
# @note This incurs an additional web request.
|
42
29
|
# @return [Channel] The `Channel` associated with this user, or `nil` if this is a Justin.tv account.
|
43
|
-
# @see Channel
|
30
|
+
# @see Channel#get Channel#get
|
44
31
|
def channel
|
45
|
-
|
32
|
+
@query.channels.get(@name)
|
46
33
|
end
|
47
34
|
|
48
35
|
# Get the live stream associated with this user.
|
@@ -50,7 +37,7 @@ module Kappa::V2
|
|
50
37
|
# @return [Stream] Live stream object for this user, or `nil` if the user is not currently streaming.
|
51
38
|
# @see #streaming?
|
52
39
|
def stream
|
53
|
-
|
40
|
+
@query.streams.get(@name)
|
54
41
|
end
|
55
42
|
|
56
43
|
# Is this user currently streaming?
|
@@ -74,51 +61,87 @@ module Kappa::V2
|
|
74
61
|
# @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/follows.md#get-usersuserfollowschannels GET /users/:user/follows/channels
|
75
62
|
# @return [Array<Channel>] List of channels the user is currently following.
|
76
63
|
def following(options = {})
|
77
|
-
return connection.accumulate(
|
64
|
+
return @query.connection.accumulate(
|
78
65
|
:path => "users/#{@name}/follows/channels",
|
79
66
|
:json => 'follows',
|
80
67
|
:sub_json => 'channel',
|
81
|
-
:
|
68
|
+
:create => -> hash { Channel.new(hash, @query) },
|
82
69
|
:limit => options[:limit],
|
83
70
|
:offset => options[:offset]
|
84
71
|
)
|
85
72
|
end
|
86
73
|
|
87
|
-
# @param channel [String
|
74
|
+
# @param channel [String/Channel/User/Stream/#name] The name of the channel to check.
|
88
75
|
# @return [Boolean] `true` if the user is following the channel, `false` otherwise.
|
89
76
|
# @see #following
|
90
77
|
# @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/follows.md#get-usersuserfollowschannelstarget GET /users/:user/follows/:channels/:target
|
91
|
-
def following?(
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
channel.name
|
78
|
+
def following?(target)
|
79
|
+
name = if target.respond_to?(:name)
|
80
|
+
target.name
|
81
|
+
else
|
82
|
+
target.to_s
|
97
83
|
end
|
98
84
|
|
99
|
-
|
85
|
+
name = CGI.escape(name)
|
100
86
|
|
101
|
-
json = connection.get("users/#{@name}/follows/channels/#{
|
87
|
+
json = @query.connection.get("users/#{@name}/follows/channels/#{name}")
|
102
88
|
status = json['status']
|
103
89
|
return !status || (status != 404)
|
104
90
|
end
|
105
91
|
|
92
|
+
# @example
|
93
|
+
# 23945610
|
106
94
|
# @return [Fixnum] Unique Twitch ID.
|
107
95
|
attr_reader :id
|
108
96
|
|
97
|
+
# @example
|
98
|
+
# 2011-08-08 21:03:44 UTC
|
109
99
|
# @return [Time] When the user account was created (UTC).
|
110
100
|
attr_reader :created_at
|
111
101
|
|
102
|
+
# @example
|
103
|
+
# 2013-07-19 23:51:43 UTC
|
112
104
|
# @return [Time] When the user account was last updated (UTC).
|
113
105
|
attr_reader :updated_at
|
114
106
|
|
107
|
+
# @example
|
108
|
+
# "LAGTVMaximusBlack"
|
115
109
|
# @return [String] User-friendly display name.
|
116
110
|
attr_reader :display_name
|
117
111
|
|
112
|
+
# @example
|
113
|
+
# "http://static-cdn.jtvnw.net/jtv_user_pictures/lagtvmaximusblack-profile_image-4b77a2305f5d85c8-300x300.png"
|
118
114
|
# @return [String] URL for the logo image.
|
119
115
|
attr_reader :logo_url
|
120
116
|
|
117
|
+
# @example
|
118
|
+
# "lagtvmaximusblack"
|
121
119
|
# @return [String] Unique Twitch name.
|
122
120
|
attr_reader :name
|
123
121
|
end
|
122
|
+
|
123
|
+
# Query class for finding users.
|
124
|
+
# @see User
|
125
|
+
class Users
|
126
|
+
# @private
|
127
|
+
def initialize(query)
|
128
|
+
@query = query
|
129
|
+
end
|
130
|
+
|
131
|
+
# Get a user by name.
|
132
|
+
# @example
|
133
|
+
# Twitch.users.get('totalbiscuit')
|
134
|
+
# @param user_name [String] The name of the user to get. This is the same as the channel or stream name.
|
135
|
+
# @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/users.md#get-usersuser GET /users/:user
|
136
|
+
# @return [User] A valid `User` object if the user exists, `nil` otherwise.
|
137
|
+
def get(user_name)
|
138
|
+
encoded_name = CGI.escape(user_name)
|
139
|
+
json = @query.connection.get("users/#{encoded_name}")
|
140
|
+
if !json || json['status'] == 404
|
141
|
+
nil
|
142
|
+
else
|
143
|
+
User.new(json, @query)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
124
147
|
end
|
data/lib/kappa/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module
|
2
|
-
VERSION = '0.
|
1
|
+
module Twitch
|
2
|
+
VERSION = '0.4.0'
|
3
3
|
end
|
data/lib/kappa/video.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
require 'cgi'
|
2
2
|
require 'time'
|
3
3
|
|
4
|
-
module
|
4
|
+
module Twitch::V2
|
5
5
|
# @private
|
6
6
|
class ChannelProxy
|
7
|
-
def initialize(name, display_name)
|
7
|
+
def initialize(name, display_name, query)
|
8
8
|
@name = name
|
9
9
|
@display_name = display_name
|
10
|
+
@query = query
|
10
11
|
end
|
11
12
|
|
12
13
|
attr_reader :name
|
@@ -15,22 +16,22 @@ module Kappa::V2
|
|
15
16
|
include Proxy
|
16
17
|
|
17
18
|
proxy {
|
18
|
-
|
19
|
+
@query.channels.get(@name)
|
19
20
|
}
|
20
21
|
end
|
21
22
|
|
22
23
|
# Videos are broadcasts or highlights owned by a channel. Broadcasts are unedited
|
23
24
|
# videos that are saved after a streaming session. Highlights are videos edited from
|
24
25
|
# broadcasts by the channel's owner.
|
25
|
-
# @see
|
26
|
+
# @see Videos#get Videos#get
|
27
|
+
# @see Videos#top Videos#top
|
26
28
|
# @see Videos
|
27
29
|
# @see Channel
|
28
30
|
class Video
|
29
|
-
include
|
30
|
-
include Kappa::IdEquality
|
31
|
+
include Twitch::IdEquality
|
31
32
|
|
32
33
|
# @private
|
33
|
-
def initialize(hash)
|
34
|
+
def initialize(hash, query)
|
34
35
|
@id = hash['_id']
|
35
36
|
@title = hash['title']
|
36
37
|
@recorded_at = Time.parse(hash['recorded_at']).utc
|
@@ -40,48 +41,38 @@ module Kappa::V2
|
|
40
41
|
@length = hash['length']
|
41
42
|
@game_name = hash['game']
|
42
43
|
@preview_url = hash['preview']
|
44
|
+
@embed_html = hash['embed']
|
43
45
|
|
44
46
|
@channel = ChannelProxy.new(
|
45
47
|
hash['channel']['name'],
|
46
|
-
hash['channel']['display_name']
|
48
|
+
hash['channel']['display_name'],
|
49
|
+
query
|
47
50
|
)
|
48
51
|
end
|
49
52
|
|
50
|
-
# Get a video by ID.
|
51
|
-
# @example
|
52
|
-
# v = Video.get('a396294648')
|
53
|
-
# v.title # => "DreamHack Open Stockholm 26-27 April"
|
54
|
-
# @param id [String] The ID of the video to get.
|
55
|
-
# @raise [ArgumentError] If `id` is `nil` or blank.
|
56
|
-
# @return [Video] A valid `Video` object if the video exists, `nil` otherwise.
|
57
|
-
def self.get(id)
|
58
|
-
raise ArgumentError if !id || id.strip.empty?
|
59
|
-
|
60
|
-
encoded_id = CGI.escape(id)
|
61
|
-
json = connection.get("videos/#{encoded_id}")
|
62
|
-
if !json || json['status'] == 404
|
63
|
-
nil
|
64
|
-
else
|
65
|
-
new(json)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
53
|
# @note This is a `String`, not a `Fixnum` like most other object IDs.
|
70
54
|
# @example
|
71
|
-
#
|
72
|
-
# v.id # => "a396294648"
|
55
|
+
# "a396294648"
|
73
56
|
# @return [String] Unique Twitch ID for this video.
|
74
57
|
attr_reader :id
|
75
58
|
|
59
|
+
# @example
|
60
|
+
# "DreamHack Open Stockholm 26-27 April"
|
76
61
|
# @return [String] Title of this video. This is seen on the video's page.
|
77
62
|
attr_reader :title
|
78
63
|
|
64
|
+
# @example
|
65
|
+
# 2013-04-27 09:37:30 UTC
|
79
66
|
# @return [Time] When this video was recorded (UTC).
|
80
67
|
attr_reader :recorded_at
|
81
68
|
|
69
|
+
# @example
|
70
|
+
# "http://www.twitch.tv/dreamhacktv/b/396294648"
|
82
71
|
# @return [String] URL of this video on Twitch.
|
83
72
|
attr_reader :url
|
84
73
|
|
74
|
+
# @example
|
75
|
+
# 81754
|
85
76
|
# @return [Fixnum] The number of views this video has received all-time.
|
86
77
|
attr_reader :view_count
|
87
78
|
|
@@ -89,41 +80,72 @@ module Kappa::V2
|
|
89
80
|
attr_reader :description
|
90
81
|
|
91
82
|
# @example
|
92
|
-
#
|
83
|
+
# 4205 # (1 hour, 10 minutes, 5 seconds)
|
93
84
|
# @return [Fixnum] The length of this video (seconds).
|
94
85
|
attr_reader :length
|
95
86
|
|
87
|
+
# @example
|
88
|
+
# "StarCraft II: Heart of the Swarm"
|
96
89
|
# @return [String] The name of the game played in this video.
|
97
90
|
attr_reader :game_name
|
98
91
|
|
92
|
+
# @example
|
93
|
+
# "http://static-cdn.jtvnw.net/jtv.thumbs/archive-396294648-320x240.jpg"
|
99
94
|
# @return [String] URL of a preview screenshot taken from the video stream.
|
100
95
|
attr_reader :preview_url
|
101
96
|
|
102
97
|
# @return [Channel] The channel on which this video was originally streamed.
|
103
98
|
attr_reader :channel
|
99
|
+
|
100
|
+
# @example
|
101
|
+
# "<object data='http://www.twitch.tv/widgets/archive_embed_player.swf'>...</object>"
|
102
|
+
# @return [String] HTML code for embedding this video on a web page.
|
103
|
+
attr_reader :embed_html
|
104
104
|
end
|
105
105
|
|
106
|
-
# Query class
|
106
|
+
# Query class for finding videos.
|
107
107
|
# @see Video
|
108
108
|
class Videos
|
109
|
-
|
109
|
+
# @private
|
110
|
+
def initialize(query)
|
111
|
+
@query = query
|
112
|
+
end
|
113
|
+
|
114
|
+
# Get a video by ID.
|
115
|
+
# @example
|
116
|
+
# Twitch.videos.get('a396294648')
|
117
|
+
# @param id [String] The ID of the video to get.
|
118
|
+
# @raise [ArgumentError] If `id` is `nil` or empty.
|
119
|
+
# @return [Video] A valid `Video` object if the video exists, `nil` otherwise.
|
120
|
+
def get(id)
|
121
|
+
raise ArgumentError, 'id' if !id || id.strip.empty?
|
122
|
+
|
123
|
+
encoded_id = CGI.escape(id)
|
124
|
+
json = @query.connection.get("videos/#{encoded_id}")
|
125
|
+
if !json || json['status'] == 404
|
126
|
+
nil
|
127
|
+
else
|
128
|
+
Video.new(json, @query)
|
129
|
+
end
|
130
|
+
end
|
110
131
|
|
111
132
|
# Get the list of most popular videos based on view count.
|
112
133
|
# @note The number of videos returned is potentially very large, so it's recommended that you specify a `:limit`.
|
113
134
|
# @example
|
114
|
-
#
|
135
|
+
# Twitch.videos.top
|
115
136
|
# @example
|
116
|
-
#
|
137
|
+
# Twitch.videos.top(:period => :month, :game => 'Super Meat Boy')
|
117
138
|
# @example
|
118
|
-
#
|
139
|
+
# Twitch.videos.top(:period => :all, :limit => 10)
|
119
140
|
# @param options [Hash] Filter criteria.
|
120
|
-
# @option options [Symbol] :period (:week) Return videos only in this time period.
|
141
|
+
# @option options [Symbol] :period (:week) Return videos only in this time period. Valid values are `:week`, `:month`, `:all`.
|
121
142
|
# @option options [String] :game (nil) Return videos only for this game.
|
122
143
|
# @option options [Fixnum] :limit (none) Limit on the number of results returned.
|
123
144
|
# @option options [Fixnum] :offset (0) Offset into the result set to begin enumeration.
|
124
145
|
# @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/videos.md#get-videostop GET /videos/top
|
146
|
+
# @raise [ArgumentError] If `:period` is not one of `:week`, `:month`, or `:all`.
|
125
147
|
# @return [Array<Video>] List of top videos.
|
126
|
-
def
|
148
|
+
def top(options = {})
|
127
149
|
params = {}
|
128
150
|
|
129
151
|
if options[:game]
|
@@ -137,11 +159,11 @@ module Kappa::V2
|
|
137
159
|
|
138
160
|
params[:period] = period.to_s
|
139
161
|
|
140
|
-
return connection.accumulate(
|
162
|
+
return @query.connection.accumulate(
|
141
163
|
:path => 'videos/top',
|
142
164
|
:params => params,
|
143
165
|
:json => 'videos',
|
144
|
-
:
|
166
|
+
:create => -> hash { Video.new(hash, @query) },
|
145
167
|
:limit => options[:limit],
|
146
168
|
:offset => options[:offset]
|
147
169
|
)
|