kappa 0.3.0 → 0.4.0
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 +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/game.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
-
module
|
1
|
+
module Twitch::V2
|
2
2
|
# Games are categories (e.g. League of Legends, Diablo 3) used by streams and channels.
|
3
3
|
# Games can be searched for by query.
|
4
|
+
# @see Games#top Games#top
|
5
|
+
# @see Games#find Games#find
|
4
6
|
# @see Games
|
5
7
|
class Game
|
6
|
-
include
|
8
|
+
include Twitch::IdEquality
|
7
9
|
|
8
10
|
# @private
|
9
11
|
def initialize(hash)
|
@@ -18,12 +20,18 @@ module Kappa::V2
|
|
18
20
|
@logo_images = Images.new(game['logo'])
|
19
21
|
end
|
20
22
|
|
23
|
+
# @example
|
24
|
+
# 21799
|
21
25
|
# @return [Fixnum] Unique Twitch ID.
|
22
26
|
attr_reader :id
|
23
27
|
|
28
|
+
# @example
|
29
|
+
# "League of Legends"
|
24
30
|
# @return [String] User-friendly game name.
|
25
31
|
attr_reader :name
|
26
32
|
|
33
|
+
# @example
|
34
|
+
# 24024
|
27
35
|
# @return [Fixnum] Unique game ID for GiantBomb.com.
|
28
36
|
attr_reader :giantbomb_id
|
29
37
|
|
@@ -33,17 +41,21 @@ module Kappa::V2
|
|
33
41
|
# @return [Images] Set of images for the game's logo.
|
34
42
|
attr_reader :logo_images
|
35
43
|
|
44
|
+
# @example
|
45
|
+
# 802
|
36
46
|
# @return [Fixnum] Total number of channels currently streaming this game on Twitch.
|
37
47
|
attr_reader :channel_count
|
38
48
|
|
49
|
+
# @example
|
50
|
+
# 68592
|
39
51
|
# @return [Fixnum] Total number of viewers across all channels currently watching this game on Twitch.
|
40
52
|
attr_reader :viewer_count
|
41
53
|
end
|
42
54
|
|
43
|
-
# A game suggestion returned by Twitch when searching for games via `
|
44
|
-
# @see Games
|
55
|
+
# A game suggestion returned by Twitch when searching for games via `Twitch.games.find`.
|
56
|
+
# @see Games#find Games#find
|
45
57
|
class GameSuggestion
|
46
|
-
include
|
58
|
+
include Twitch::IdEquality
|
47
59
|
|
48
60
|
# @private
|
49
61
|
def initialize(hash)
|
@@ -55,16 +67,24 @@ module Kappa::V2
|
|
55
67
|
@logo_images = Images.new(hash['logo'])
|
56
68
|
end
|
57
69
|
|
70
|
+
# @example
|
71
|
+
# 155075940
|
58
72
|
# @return [Fixnum] Unique Twitch ID.
|
59
73
|
attr_reader :id
|
60
74
|
|
75
|
+
# @example
|
76
|
+
# "Dark Souls"
|
61
77
|
# @return [String] Game name.
|
62
78
|
attr_reader :name
|
63
79
|
|
80
|
+
# @example
|
81
|
+
# 32697
|
64
82
|
# @return [Fixnum] Unique game ID for GiantBomb.com.
|
65
83
|
attr_reader :giantbomb_id
|
66
84
|
|
67
|
-
# @
|
85
|
+
# @example
|
86
|
+
# 67
|
87
|
+
# @return [Fixnum] Relative popularity metric. Higher number means more popular. This value only has meaning relative to other popularity values.
|
68
88
|
attr_reader :popularity
|
69
89
|
|
70
90
|
# @return [Images] Set of images for the game's box art.
|
@@ -74,36 +94,39 @@ module Kappa::V2
|
|
74
94
|
attr_reader :logo_images
|
75
95
|
end
|
76
96
|
|
77
|
-
# Query class
|
97
|
+
# Query class for finding top games or finding games by name.
|
78
98
|
# @see Game
|
79
99
|
# @see GameSuggestion
|
80
100
|
class Games
|
81
|
-
|
101
|
+
# @private
|
102
|
+
def initialize(query)
|
103
|
+
@query = query
|
104
|
+
end
|
82
105
|
|
83
106
|
# Get a list of games with the highest number of current viewers on Twitch.
|
84
107
|
# @example
|
85
|
-
#
|
108
|
+
# Twitch.games.top
|
86
109
|
# @example
|
87
|
-
#
|
110
|
+
# Twitch.games.top(:limit => 10)
|
88
111
|
# @param options [Hash] Filter criteria.
|
89
112
|
# @option options [Boolean] :hls (nil) If `true`, limit the games to those that have any streams using HLS (HTTP Live Streaming). If `false` or `nil`, do not limit.
|
90
113
|
# @option options [Fixnum] :limit (none) Limit on the number of results returned.
|
91
114
|
# @option options [Fixnum] :offset (0) Offset into the result set to begin enumeration.
|
92
|
-
# @see Game
|
115
|
+
# @see Game Game
|
93
116
|
# @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/games.md#get-gamestop GET /games/top
|
94
117
|
# @return [Array<Game>] List of games sorted by number of current viewers on Twitch, most popular first.
|
95
|
-
def
|
118
|
+
def top(options = {})
|
96
119
|
params = {}
|
97
120
|
|
98
121
|
if options[:hls]
|
99
122
|
params[:hls] = true
|
100
123
|
end
|
101
124
|
|
102
|
-
return connection.accumulate(
|
125
|
+
return @query.connection.accumulate(
|
103
126
|
:path => 'games/top',
|
104
127
|
:params => params,
|
105
128
|
:json => 'top',
|
106
|
-
:
|
129
|
+
:create => Game,
|
107
130
|
:limit => options[:limit],
|
108
131
|
:offset => options[:offset]
|
109
132
|
)
|
@@ -111,18 +134,18 @@ module Kappa::V2
|
|
111
134
|
|
112
135
|
# Get a list of games with names similar to the specified name.
|
113
136
|
# @example
|
114
|
-
#
|
137
|
+
# Twitch.games.find(:name => 'diablo')
|
115
138
|
# @example
|
116
|
-
#
|
139
|
+
# Twitch.games.find(:name => 'starcraft', :live => true)
|
117
140
|
# @param options [Hash] Search criteria.
|
118
141
|
# @option options [String] :name Game name search term. This can be a partial name, e.g. `"league"`.
|
119
142
|
# @option options [Boolean] :live (false) If `true`, only returns games that are currently live on at least one channel.
|
120
143
|
# @option options [Fixnum] :limit (none) Limit on the number of results returned.
|
121
|
-
# @see GameSuggestion
|
144
|
+
# @see GameSuggestion GameSuggestion
|
122
145
|
# @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/search.md#get-searchgames GET /search/games
|
123
146
|
# @raise [ArgumentError] If `:name` is not specified.
|
124
147
|
# @return [Array<GameSuggestion>] List of games matching the criteria.
|
125
|
-
def
|
148
|
+
def find(options)
|
126
149
|
raise ArgumentError, 'options' if options.nil?
|
127
150
|
raise ArgumentError, 'name' if options[:name].nil?
|
128
151
|
|
@@ -135,11 +158,11 @@ module Kappa::V2
|
|
135
158
|
params.merge!(:live => true)
|
136
159
|
end
|
137
160
|
|
138
|
-
return connection.accumulate(
|
161
|
+
return @query.connection.accumulate(
|
139
162
|
:path => 'search/games',
|
140
163
|
:params => params,
|
141
164
|
:json => 'games',
|
142
|
-
:
|
165
|
+
:create => GameSuggestion,
|
143
166
|
:limit => options[:limit]
|
144
167
|
)
|
145
168
|
end
|
data/lib/kappa/id_equality.rb
CHANGED
data/lib/kappa/images.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module Twitch::V2
|
2
2
|
# A group of URLs pointing to variously-sized versions of the same image.
|
3
3
|
class Images
|
4
4
|
# @private
|
@@ -10,6 +10,8 @@ module Kappa::V2
|
|
10
10
|
end
|
11
11
|
|
12
12
|
# Get a URL pointing to an image with a specific size.
|
13
|
+
# @example
|
14
|
+
# url = images.url(320, 200)
|
13
15
|
# @param width [Fixnum] Desired width of the image.
|
14
16
|
# @param height [Fixnum] Desired height of the image.
|
15
17
|
# @return [String] URL pointing to the image with the specified size.
|
@@ -17,16 +19,24 @@ module Kappa::V2
|
|
17
19
|
@template_url.gsub('{width}', width.to_s).gsub('{height}', height.to_s)
|
18
20
|
end
|
19
21
|
|
22
|
+
# @example
|
23
|
+
# "http://static-cdn.jtvnw.net/ttv-logoart/League%20of%20Legends-240x144.jpg"
|
20
24
|
# @return [String] URL for the large-sized version of this image.
|
21
25
|
attr_reader :large_url
|
22
26
|
|
27
|
+
# @example
|
28
|
+
# "http://static-cdn.jtvnw.net/ttv-logoart/League%20of%20Legends-120x72.jpg"
|
23
29
|
# @return [String] URL for the medium-sized version of this image.
|
24
30
|
attr_reader :medium_url
|
25
31
|
|
32
|
+
# @example
|
33
|
+
# "http://static-cdn.jtvnw.net/ttv-logoart/League%20of%20Legends-60x36.jpg"
|
26
34
|
# @return [String] URL for the small-sized version of this image.
|
27
35
|
attr_reader :small_url
|
28
36
|
|
29
37
|
# @note You shouldn't need to use this property directly. See #url for getting a formatted URL instead.
|
38
|
+
# @example
|
39
|
+
# "http://static-cdn.jtvnw.net/ttv-logoart/League%20of%20Legends-{width}x{height}.jpg"
|
30
40
|
# @return [String] Template image URL with placeholders for width and height.
|
31
41
|
# @see #url
|
32
42
|
attr_reader :template_url
|
data/lib/kappa/query.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
module Twitch::V2
|
2
|
+
# @private
|
3
|
+
class Query
|
4
|
+
def initialize(connection)
|
5
|
+
@connection = connection
|
6
|
+
@channels = Channels.new(self)
|
7
|
+
@streams = Streams.new(self)
|
8
|
+
@users = Users.new(self)
|
9
|
+
@games = Games.new(self)
|
10
|
+
@teams = Teams.new(self)
|
11
|
+
@videos = Videos.new(self)
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :connection
|
15
|
+
attr_reader :channels
|
16
|
+
attr_reader :streams
|
17
|
+
attr_reader :users
|
18
|
+
attr_reader :games
|
19
|
+
attr_reader :teams
|
20
|
+
attr_reader :videos
|
21
|
+
end
|
22
|
+
end
|
data/lib/kappa/stream.rb
CHANGED
@@ -1,75 +1,63 @@
|
|
1
1
|
require 'cgi'
|
2
2
|
|
3
|
-
module
|
3
|
+
module Twitch::V2
|
4
4
|
# Streams are video broadcasts that are currently live. They belong to a user and are part of a channel.
|
5
|
-
# @see
|
5
|
+
# @see Streams#get Streams#get
|
6
|
+
# @see Streams#find Streams#find
|
7
|
+
# @see Streams#featured Streams#featured
|
6
8
|
# @see Streams
|
7
9
|
# @see Channel
|
8
10
|
class Stream
|
9
|
-
include
|
10
|
-
include Kappa::IdEquality
|
11
|
+
include Twitch::IdEquality
|
11
12
|
|
12
13
|
# @private
|
13
|
-
def initialize(hash)
|
14
|
+
def initialize(hash, query)
|
15
|
+
@query = query
|
14
16
|
@id = hash['_id']
|
15
17
|
@broadcaster = hash['broadcaster']
|
16
18
|
@game_name = hash['game']
|
17
19
|
@name = hash['name']
|
18
20
|
@viewer_count = hash['viewers']
|
19
21
|
@preview_url = hash['preview']
|
20
|
-
@channel = Channel.new(hash['channel'])
|
22
|
+
@channel = Channel.new(hash['channel'], @query)
|
21
23
|
@url = @channel.url
|
22
24
|
end
|
23
25
|
|
24
|
-
# Get a live stream by name.
|
25
|
-
# @example
|
26
|
-
# s = Stream.get('lagtvmaximusblack')
|
27
|
-
# s.nil? # => false (stream is live)
|
28
|
-
# s.game_name # => "StarCraft II: Heart of the Swarm"
|
29
|
-
# s.viewer_count # => 2403
|
30
|
-
# @example
|
31
|
-
# s = Strearm.get('destiny')
|
32
|
-
# s.nil? # => true (stream is offline)
|
33
|
-
# @param stream_name [String] The name of the stream to get. This is the same as the channel or user name.
|
34
|
-
# @see Streams.find
|
35
|
-
# @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/streams.md#get-streamschannel GET /streams/:channel
|
36
|
-
# @return [Stream] A valid `Stream` object if the stream exists and is currently live, `nil` otherwise.
|
37
|
-
def self.get(stream_name)
|
38
|
-
encoded_name = CGI.escape(stream_name)
|
39
|
-
json = connection.get("streams/#{encoded_name}")
|
40
|
-
stream = json['stream']
|
41
|
-
if json['status'] == 404 || !stream
|
42
|
-
nil
|
43
|
-
else
|
44
|
-
new(stream)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
26
|
# Get the owner of this stream.
|
49
27
|
# @note This incurs an additional web request.
|
50
28
|
# @return [User] The user that owns this stream.
|
51
29
|
def user
|
52
|
-
|
30
|
+
@query.users.get(@channel.name)
|
53
31
|
end
|
54
32
|
|
33
|
+
# @example
|
34
|
+
# 6226912672
|
55
35
|
# @return [Fixnum] Unique Twitch ID.
|
56
36
|
attr_reader :id
|
57
37
|
|
58
38
|
# @example
|
59
39
|
# "fme", "xsplit", "obs", "rebroadcast", "delay", "unknown rtmp"
|
60
|
-
# @deprecated This attribute
|
40
|
+
# @deprecated This attribute is not present in the V3 API.
|
61
41
|
# @return [String] The broadcasting software used for this stream.
|
62
42
|
attr_reader :broadcaster
|
63
43
|
|
44
|
+
# @example
|
45
|
+
# "Super Meat Boy"
|
64
46
|
# @return [String] The name of the game currently being streamed.
|
65
47
|
attr_reader :game_name
|
66
48
|
|
49
|
+
# @example
|
50
|
+
# "live_user_lethalfrag"
|
67
51
|
# @return [String] The unique Twitch name for this stream.
|
68
52
|
attr_reader :name
|
69
53
|
|
54
|
+
# @example
|
55
|
+
# 2342
|
70
56
|
# @return [Fixnum] The number of viewers currently watching the stream.
|
71
57
|
attr_reader :viewer_count
|
72
58
|
|
59
|
+
# @example
|
60
|
+
# "http://static-cdn.jtvnw.net/previews-ttv/live_user_lethalfrag-320x200.jpg"
|
73
61
|
# @return [String] URL of a preview screenshot taken from the video stream.
|
74
62
|
attr_reader :preview_url
|
75
63
|
|
@@ -77,36 +65,66 @@ module Kappa::V2
|
|
77
65
|
# @return [Channel] The `Channel` associated with this stream.
|
78
66
|
attr_reader :channel
|
79
67
|
|
68
|
+
# @example
|
69
|
+
# "http://www.twitch.tv/lethalfrag"
|
80
70
|
# @return [String] The URL for this stream.
|
81
71
|
attr_reader :url
|
82
72
|
end
|
83
73
|
|
84
|
-
# Query class
|
74
|
+
# Query class for finding featured streams or streams meeting certain criteria.
|
85
75
|
# @see Stream
|
86
76
|
class Streams
|
87
|
-
|
77
|
+
# @private
|
78
|
+
def initialize(query)
|
79
|
+
@query = query
|
80
|
+
end
|
81
|
+
|
82
|
+
# Get a live stream by name.
|
83
|
+
# @example
|
84
|
+
# s = Twitch.streams.get('lagtvmaximusblack')
|
85
|
+
# s.nil? # => false (stream is live)
|
86
|
+
# s.game_name # => "StarCraft II: Heart of the Swarm"
|
87
|
+
# s.viewer_count # => 2403
|
88
|
+
# @example
|
89
|
+
# s = Twitch.streams.get('destiny')
|
90
|
+
# s.nil? # => true (stream is offline)
|
91
|
+
# @param stream_name [String] The name of the stream to get. This is the same as the channel or user name.
|
92
|
+
# @see #find
|
93
|
+
# @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/streams.md#get-streamschannel GET /streams/:channel
|
94
|
+
# @return [Stream] A valid `Stream` object if the stream exists and is currently live, `nil` otherwise.
|
95
|
+
def get(stream_name)
|
96
|
+
encoded_name = CGI.escape(stream_name)
|
97
|
+
json = @query.connection.get("streams/#{encoded_name}")
|
98
|
+
stream = json['stream']
|
99
|
+
if json['status'] == 404 || !stream
|
100
|
+
nil
|
101
|
+
else
|
102
|
+
Stream.new(stream, @query)
|
103
|
+
end
|
104
|
+
end
|
88
105
|
|
89
106
|
# Get a list of streams for a specific game, for a set of channels, or by other criteria.
|
90
107
|
# @example
|
91
|
-
#
|
108
|
+
# Twitch.streams.find(:game => 'League of Legends', :limit => 50)
|
92
109
|
# @example
|
93
|
-
#
|
110
|
+
# Twitch.streams.find(:channel => ['fgtvlive', 'incontroltv', 'destiny'])
|
94
111
|
# @example
|
95
|
-
#
|
112
|
+
# Twitch.streams.find(:game => 'Diablo III', :channel => ['nl_kripp', 'protech'])
|
96
113
|
# @param options [Hash] Search criteria.
|
97
114
|
# @option options [String/Game/#name] :game Only return streams currently streaming the specified game.
|
98
115
|
# @option options [Array<String/Channel/#name>] :channel Only return streams for these channels.
|
99
116
|
# If a channel is not currently streaming, it is omitted. You must specify an array of channels
|
100
|
-
# or channel names. If you want to find the stream for a single channel, see {
|
117
|
+
# or channel names. If you want to find the stream for a single channel, see {Streams#get}.
|
101
118
|
# @option options [Boolean] :embeddable (nil) If `true`, limit the streams to those that can be embedded. If `false` or `nil`, do not limit.
|
102
119
|
# @option options [Boolean] :hls (nil) If `true`, limit the streams to those using HLS (HTTP Live Streaming). If `false` or `nil`, do not limit.
|
103
120
|
# @option options [Fixnum] :limit (none) Limit on the number of results returned.
|
104
121
|
# @option options [Fixnum] :offset (0) Offset into the result set to begin enumeration.
|
105
|
-
# @see
|
122
|
+
# @see #get
|
106
123
|
# @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/streams.md#get-streams GET /streams
|
107
124
|
# @raise [ArgumentError] If `options` does not specify a search criteria (`:game`, `:channel`, `:embeddable`, or `:hls`).
|
125
|
+
# @raise [ArgumentError] If `:channel` is not an array.
|
108
126
|
# @return [Array<Stream>] List of streams matching the specified criteria.
|
109
|
-
def
|
127
|
+
def find(options)
|
110
128
|
check = options.dup
|
111
129
|
check.delete(:limit)
|
112
130
|
check.delete(:offset)
|
@@ -116,6 +134,10 @@ module Kappa::V2
|
|
116
134
|
|
117
135
|
channels = options[:channel]
|
118
136
|
if channels
|
137
|
+
if !channels.respond_to?(:map)
|
138
|
+
raise ArgumentError, ':channel'
|
139
|
+
end
|
140
|
+
|
119
141
|
params[:channel] = channels.map { |channel|
|
120
142
|
if channel.respond_to?(:name)
|
121
143
|
channel.name
|
@@ -142,11 +164,11 @@ module Kappa::V2
|
|
142
164
|
params[:embeddable] = true
|
143
165
|
end
|
144
166
|
|
145
|
-
return connection.accumulate(
|
167
|
+
return @query.connection.accumulate(
|
146
168
|
:path => 'streams',
|
147
169
|
:params => params,
|
148
170
|
:json => 'streams',
|
149
|
-
:
|
171
|
+
:create => -> hash { Stream.new(hash, @query) },
|
150
172
|
:limit => options[:limit],
|
151
173
|
:offset => options[:offset]
|
152
174
|
)
|
@@ -155,28 +177,28 @@ module Kappa::V2
|
|
155
177
|
# Get the list of currently featured (promoted) streams. This includes the list of streams shown on the Twitch homepage.
|
156
178
|
# @note There is no guarantee of how many streams are featured at any given time.
|
157
179
|
# @example
|
158
|
-
#
|
180
|
+
# Twitch.streams.featured
|
159
181
|
# @example
|
160
|
-
#
|
182
|
+
# Twitch.streams.featured(:limit => 5)
|
161
183
|
# @param options [Hash] Filter criteria.
|
162
184
|
# @option options [Boolean] :hls (nil) If `true`, limit the streams to those using HLS (HTTP Live Streaming). If `false` or `nil`, do not limit.
|
163
185
|
# @option options [Fixnum] :limit (none) Limit on the number of results returned.
|
164
186
|
# @option options [Fixnum] :offset (0) Offset into the result set to begin enumeration.
|
165
187
|
# @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/streams.md#get-streamsfeatured GET /streams/featured
|
166
188
|
# @return [Array<Stream>] List of currently featured streams.
|
167
|
-
def
|
189
|
+
def featured(options = {})
|
168
190
|
params = {}
|
169
191
|
|
170
192
|
if options[:hls]
|
171
193
|
params[:hls] = true
|
172
194
|
end
|
173
195
|
|
174
|
-
return connection.accumulate(
|
196
|
+
return @query.connection.accumulate(
|
175
197
|
:path => 'streams/featured',
|
176
198
|
:params => params,
|
177
199
|
:json => 'featured',
|
178
200
|
:sub_json => 'stream',
|
179
|
-
:
|
201
|
+
:create => -> hash { Stream.new(hash, @query) },
|
180
202
|
:limit => options[:limit],
|
181
203
|
:offset => options[:offset]
|
182
204
|
)
|