kappa 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,17 +1,17 @@
1
- module Twitch
2
- # @private
3
- module IdEquality
4
- def hash
5
- @id.hash
6
- end
7
-
8
- def eql?(other)
9
- other && (self.class == other.class) && (self.id == other.id)
10
- end
11
-
12
- def ==(other)
13
- eql?(other)
14
- end
15
- end
16
- end
17
-
1
+ module Twitch
2
+ # @private
3
+ module IdEquality
4
+ def hash
5
+ @id.hash
6
+ end
7
+
8
+ def eql?(other)
9
+ other && (self.class == other.class) && (self.id == other.id)
10
+ end
11
+
12
+ def ==(other)
13
+ eql?(other)
14
+ end
15
+ end
16
+ end
17
+
@@ -1,44 +1,44 @@
1
- module Twitch::V2
2
- # A group of URLs pointing to variously-sized versions of the same image.
3
- class Images
4
- # @private
5
- def initialize(hash)
6
- @large_url = hash['large']
7
- @medium_url = hash['medium']
8
- @small_url = hash['small']
9
- @template_url = hash['template']
10
- end
11
-
12
- # Get a URL pointing to an image with a specific size.
13
- # @example
14
- # url = images.url(320, 200)
15
- # @param width [Fixnum] Desired width of the image.
16
- # @param height [Fixnum] Desired height of the image.
17
- # @return [String] URL pointing to the image with the specified size.
18
- def url(width, height)
19
- @template_url.gsub('{width}', width.to_s).gsub('{height}', height.to_s)
20
- end
21
-
22
- # @example
23
- # "http://static-cdn.jtvnw.net/ttv-logoart/League%20of%20Legends-240x144.jpg"
24
- # @return [String] URL for the large-sized version of this image.
25
- attr_reader :large_url
26
-
27
- # @example
28
- # "http://static-cdn.jtvnw.net/ttv-logoart/League%20of%20Legends-120x72.jpg"
29
- # @return [String] URL for the medium-sized version of this image.
30
- attr_reader :medium_url
31
-
32
- # @example
33
- # "http://static-cdn.jtvnw.net/ttv-logoart/League%20of%20Legends-60x36.jpg"
34
- # @return [String] URL for the small-sized version of this image.
35
- attr_reader :small_url
36
-
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"
40
- # @return [String] Template image URL with placeholders for width and height.
41
- # @see #url
42
- attr_reader :template_url
43
- end
44
- end
1
+ module Twitch::V2
2
+ # A group of URLs pointing to variously-sized versions of the same image.
3
+ class Images
4
+ # @private
5
+ def initialize(hash)
6
+ @large_url = hash['large']
7
+ @medium_url = hash['medium']
8
+ @small_url = hash['small']
9
+ @template_url = hash['template']
10
+ end
11
+
12
+ # Get a URL pointing to an image with a specific size.
13
+ # @example
14
+ # url = images.url(320, 200)
15
+ # @param width [Fixnum] Desired width of the image.
16
+ # @param height [Fixnum] Desired height of the image.
17
+ # @return [String] URL pointing to the image with the specified size.
18
+ def url(width, height)
19
+ @template_url.gsub('{width}', width.to_s).gsub('{height}', height.to_s)
20
+ end
21
+
22
+ # @example
23
+ # "http://static-cdn.jtvnw.net/ttv-logoart/League%20of%20Legends-240x144.jpg"
24
+ # @return [String] URL for the large-sized version of this image.
25
+ attr_reader :large_url
26
+
27
+ # @example
28
+ # "http://static-cdn.jtvnw.net/ttv-logoart/League%20of%20Legends-120x72.jpg"
29
+ # @return [String] URL for the medium-sized version of this image.
30
+ attr_reader :medium_url
31
+
32
+ # @example
33
+ # "http://static-cdn.jtvnw.net/ttv-logoart/League%20of%20Legends-60x36.jpg"
34
+ # @return [String] URL for the small-sized version of this image.
35
+ attr_reader :small_url
36
+
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"
40
+ # @return [String] Template image URL with placeholders for width and height.
41
+ # @see #url
42
+ attr_reader :template_url
43
+ end
44
+ end
@@ -1,32 +1,32 @@
1
- # @private
2
- module Proxy
3
- def self.included(base)
4
- base.extend(ClassMethods)
5
- end
6
-
7
- module ClassMethods
8
- def proxy(&create_block)
9
- self.class_variable_set(:@@creator, create_block)
10
- end
11
- end
12
-
13
- def method_missing(*args)
14
- real.send(*args)
15
- end
16
-
17
- def respond_to?(sym, include_private = false)
18
- real.respond_to?(sym, include_private) || super
19
- end
20
-
21
- def respond_to_missing?(method_name, include_private = false)
22
- real.respond_to?(method_name, include_private) || super
23
- end
24
-
25
- private
26
- def real
27
- @real ||= begin
28
- creator = self.class.class_variable_get(:@@creator)
29
- self.instance_eval(&creator)
30
- end
31
- end
32
- end
1
+ # @private
2
+ module Proxy
3
+ def self.included(base)
4
+ base.extend(ClassMethods)
5
+ end
6
+
7
+ module ClassMethods
8
+ def proxy(&create_block)
9
+ self.class_variable_set(:@@creator, create_block)
10
+ end
11
+ end
12
+
13
+ def method_missing(*args)
14
+ real.send(*args)
15
+ end
16
+
17
+ def respond_to?(sym, include_private = false)
18
+ real.respond_to?(sym, include_private) || super
19
+ end
20
+
21
+ def respond_to_missing?(method_name, include_private = false)
22
+ real.respond_to?(method_name, include_private) || super
23
+ end
24
+
25
+ private
26
+ def real
27
+ @real ||= begin
28
+ creator = self.class.class_variable_get(:@@creator)
29
+ self.instance_eval(&creator)
30
+ end
31
+ end
32
+ end
@@ -1,22 +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
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
@@ -1,16 +1,16 @@
1
- module Twitch
2
- # @private
3
- class Status
4
- def self.map(status_map, &block)
5
- begin
6
- block.call
7
- rescue Error::ClientError, Error::ServerError => e
8
- if status_map.include? e.status
9
- status_map[e.status]
10
- else
11
- raise
12
- end
13
- end
14
- end
15
- end
16
- end
1
+ module Twitch
2
+ # @private
3
+ class Status
4
+ def self.map(status_map, &block)
5
+ begin
6
+ block.call
7
+ rescue Error::ClientError, Error::ServerError => e
8
+ if status_map.include? e.status
9
+ status_map[e.status]
10
+ else
11
+ raise
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,288 +1,288 @@
1
- require 'cgi'
2
-
3
- module Twitch::V2
4
- # Streams are video broadcasts that are currently live. They belong to a user and are part of a channel.
5
- # @see Streams#get Streams#get
6
- # @see Streams#find Streams#find
7
- # @see Streams#featured Streams#featured
8
- # @see Streams
9
- # @see Channel
10
- class Stream
11
- include Twitch::IdEquality
12
-
13
- # @private
14
- def initialize(hash, query)
15
- @query = query
16
- @id = hash['_id']
17
- @broadcaster = hash['broadcaster']
18
- @game_name = hash['game']
19
- @name = hash['name']
20
- @viewer_count = hash['viewers']
21
- @preview_url = hash['preview']
22
- @channel = Channel.new(hash['channel'], @query)
23
- @url = @channel.url
24
- end
25
-
26
- # Get the owner of this stream.
27
- # @note This incurs an additional web request.
28
- # @return [User] The user that owns this stream.
29
- def user
30
- @query.users.get(@channel.name)
31
- end
32
-
33
- # @example
34
- # 6226912672
35
- # @return [Fixnum] Unique Twitch ID.
36
- attr_reader :id
37
-
38
- # @example
39
- # "fme", "xsplit", "obs", "rebroadcast", "delay", "unknown rtmp"
40
- # @deprecated This attribute is not present in the V3 API.
41
- # @return [String] The broadcasting software used for this stream.
42
- attr_reader :broadcaster
43
-
44
- # @example
45
- # "Super Meat Boy"
46
- # @return [String] The name of the game currently being streamed.
47
- attr_reader :game_name
48
-
49
- # @example
50
- # "live_user_lethalfrag"
51
- # @return [String] The unique Twitch name for this stream.
52
- attr_reader :name
53
-
54
- # @example
55
- # 2342
56
- # @return [Fixnum] The number of viewers currently watching the stream.
57
- attr_reader :viewer_count
58
-
59
- # @example
60
- # "http://static-cdn.jtvnw.net/previews-ttv/live_user_lethalfrag-320x200.jpg"
61
- # @return [String] URL of a preview screenshot taken from the video stream.
62
- attr_reader :preview_url
63
-
64
- # @note This does not incur any web requests.
65
- # @return [Channel] The `Channel` associated with this stream.
66
- attr_reader :channel
67
-
68
- # @example
69
- # "http://www.twitch.tv/lethalfrag"
70
- # @return [String] The URL for this stream.
71
- attr_reader :url
72
- end
73
-
74
- # Site-wide stream summary statistics.
75
- # @see Streams#summary Streams#summary
76
- class StreamSummary
77
- # @private
78
- def initialize(hash)
79
- @viewer_count = hash['viewers']
80
- @channel_count = hash['channels']
81
- end
82
-
83
- # @example
84
- # 194774
85
- # @return [Fixnum] The sum of all viewers across all live streams.
86
- attr_reader :viewer_count
87
-
88
- # @example
89
- # 4144
90
- # @return [Fixnum] The count of all channels currently streaming.
91
- attr_reader :channel_count
92
- end
93
-
94
- # Query class for finding featured streams or streams meeting certain criteria.
95
- # @see Stream
96
- class Streams
97
- # @private
98
- def initialize(query)
99
- @query = query
100
- end
101
-
102
- # Get a live stream by name.
103
- # @example
104
- # s = Twitch.streams.get('lagtvmaximusblack')
105
- # s.nil? # => false (stream is live)
106
- # s.game_name # => "StarCraft II: Heart of the Swarm"
107
- # s.viewer_count # => 2403
108
- # @example
109
- # s = Twitch.streams.get('destiny')
110
- # s.nil? # => true (stream is offline)
111
- # @param stream_name [String] The name of the stream to get. This is the same as the channel or user name.
112
- # @see #find
113
- # @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/streams.md#get-streamschannel GET /streams/:channel
114
- # @return [Stream] A valid `Stream` object, if the stream exists and is live.
115
- # @return [nil] If the stream does not exist or is not live.
116
- def get(stream_name)
117
- name = CGI.escape(stream_name)
118
-
119
- # HTTP 422 can happen if the stream is associated with a Justin.tv account.
120
- Twitch::Status.map(404 => nil, 422 => nil) do
121
- json = @query.connection.get("streams/#{name}")
122
- stream = json['stream']
123
- stream.nil? ? nil : Stream.new(stream, @query)
124
- end
125
- end
126
-
127
- # Get all currently live streams.
128
- # @example
129
- # Twitch.streams.all
130
- # @example
131
- # Twitch.streams.all(:offset => 100, :limit => 10)
132
- # @example
133
- # Twitch.streams.all do |stream|
134
- # next if stream.viewer_count < 1000
135
- # puts stream.url
136
- # end
137
- # @param options [Hash] Limit criteria.
138
- # @option options [Fixnum] :limit (nil) Limit on the number of results returned.
139
- # @option options [Fixnum] :offset (0) Offset into the result set to begin enumeration.
140
- # @yield Optional. If a block is given, each stream is yielded.
141
- # @yieldparam [Stream] stream Current stream.
142
- # @see #get
143
- # @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/streams.md#get-streams GET /streams
144
- # @return [Array<Stream>] Currently live streams, if no block is given.
145
- # @return [nil] If a block is given.
146
- def all(options = {}, &block)
147
- return @query.connection.accumulate(
148
- :path => 'streams',
149
- :json => 'streams',
150
- :create => -> hash { Stream.new(hash, @query) },
151
- :limit => options[:limit],
152
- :offset => options[:offset],
153
- &block
154
- )
155
- end
156
-
157
- # Get streams for a specific game, for a set of channels, or by other criteria.
158
- # @example
159
- # Twitch.streams.find(:game => 'League of Legends', :limit => 50)
160
- # @example
161
- # Twitch.streams.find(:channel => ['fgtvlive', 'incontroltv', 'destiny'])
162
- # @example
163
- # Twitch.streams.find(:game => 'Diablo III', :channel => ['nl_kripp', 'protech'])
164
- # @example
165
- # Twitch.streams.find(:game => 'League of Legends') do |stream|
166
- # next if stream.viewer_count < 1000
167
- # puts stream.url
168
- # end
169
- # @param options [Hash] Search criteria.
170
- # @option options [String, Game, #name] :game Only return streams currently streaming the specified game.
171
- # @option options [Array<String, Channel, #name>] :channel Only return streams for these channels.
172
- # If a channel is not currently streaming, it is omitted. You must specify an array of channels
173
- # or channel names. If you want to find the stream for a single channel, see {Streams#get}.
174
- # @option options [Boolean] :embeddable (nil) If `true`, limit the streams to those that can be embedded. If `false` or `nil`, do not limit.
175
- # @option options [Boolean] :hls (nil) If `true`, limit the streams to those using HLS (HTTP Live Streaming). If `false` or `nil`, do not limit.
176
- # @option options [Fixnum] :limit (nil) Limit on the number of results returned.
177
- # @option options [Fixnum] :offset (0) Offset into the result set to begin enumeration.
178
- # @yield Optional. If a block is given, each stream found is yielded.
179
- # @yieldparam [Stream] stream Current stream.
180
- # @see #get
181
- # @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/streams.md#get-streams GET /streams
182
- # @raise [ArgumentError] If `options` does not specify a search criteria (`:game`, `:channel`, `:embeddable`, or `:hls`).
183
- # @raise [ArgumentError] If `:channel` is not an array.
184
- # @return [Array<Stream>] Streams matching the specified criteria, if no block is given.
185
- # @return [nil] If a block is given.
186
- def find(options, &block)
187
- check = options.dup
188
- check.delete(:limit)
189
- check.delete(:offset)
190
- raise ArgumentError, 'options' if check.empty?
191
-
192
- params = {}
193
-
194
- channels = options[:channel]
195
- if channels
196
- if !channels.respond_to?(:map)
197
- raise ArgumentError, ':channel'
198
- end
199
-
200
- params[:channel] = channels.map { |channel|
201
- if channel.respond_to?(:name)
202
- channel.name
203
- else
204
- channel.to_s
205
- end
206
- }.join(',')
207
- end
208
-
209
- game = options[:game]
210
- if game
211
- if game.respond_to?(:name)
212
- params[:game] = game.name
213
- else
214
- params[:game] = game.to_s
215
- end
216
- end
217
-
218
- if options[:hls]
219
- params[:hls] = true
220
- end
221
-
222
- if options[:embeddable]
223
- params[:embeddable] = true
224
- end
225
-
226
- return @query.connection.accumulate(
227
- :path => 'streams',
228
- :params => params,
229
- :json => 'streams',
230
- :create => -> hash { Stream.new(hash, @query) },
231
- :limit => options[:limit],
232
- :offset => options[:offset],
233
- &block
234
- )
235
- end
236
-
237
- # Get the currently featured (promoted) streams. This includes the streams shown on the Twitch homepage.
238
- # @note There is no guarantee of how many streams are featured at any given time.
239
- # @example
240
- # Twitch.streams.featured
241
- # @example
242
- # Twitch.streams.featured(:limit => 5)
243
- # @example
244
- # Twitch.streams.featured do |stream|
245
- # next if stream.viewer_count < 1000
246
- # puts stream.url
247
- # end
248
- # @param options [Hash] Filter criteria.
249
- # @option options [Boolean] :hls (nil) If `true`, limit the streams to those using HLS (HTTP Live Streaming). If `false` or `nil`, do not limit.
250
- # @option options [Fixnum] :limit (nil) Limit on the number of results returned.
251
- # @option options [Fixnum] :offset (0) Offset into the result set to begin enumeration.
252
- # @yield Optional. If a block is given, each featured stream is yielded.
253
- # @yieldparam [Stream] stream Current stream.
254
- # @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/streams.md#get-streamsfeatured GET /streams/featured
255
- # @return [Array<Stream>] Featured streams, if no block is given.
256
- # @return [nil] If a block is given.
257
- def featured(options = {}, &block)
258
- params = {}
259
-
260
- if options[:hls]
261
- params[:hls] = true
262
- end
263
-
264
- return @query.connection.accumulate(
265
- :path => 'streams/featured',
266
- :params => params,
267
- :json => 'featured',
268
- :sub_json => 'stream',
269
- :create => -> hash { Stream.new(hash, @query) },
270
- :limit => options[:limit],
271
- :offset => options[:offset],
272
- &block
273
- )
274
- end
275
-
276
- # Get site-wide stream summary statistics.
277
- # @example
278
- # summary = Twitch.streams.summary
279
- # summary.viewer_count # => 194774
280
- # summary.channel_count # => 4144
281
- # @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/streams.md#gedt-streamssummary GET /streams/summary
282
- # @return [StreamSummary] Stream summary statistics.
283
- def summary
284
- json = @query.connection.get('streams/summary')
285
- StreamSummary.new(json)
286
- end
287
- end
288
- end
1
+ require 'cgi'
2
+
3
+ module Twitch::V2
4
+ # Streams are video broadcasts that are currently live. They belong to a user and are part of a channel.
5
+ # @see Streams#get Streams#get
6
+ # @see Streams#find Streams#find
7
+ # @see Streams#featured Streams#featured
8
+ # @see Streams
9
+ # @see Channel
10
+ class Stream
11
+ include Twitch::IdEquality
12
+
13
+ # @private
14
+ def initialize(hash, query)
15
+ @query = query
16
+ @id = hash['_id']
17
+ @broadcaster = hash['broadcaster']
18
+ @game_name = hash['game']
19
+ @name = hash['name']
20
+ @viewer_count = hash['viewers']
21
+ @preview_url = hash['preview']
22
+ @channel = Channel.new(hash['channel'], @query)
23
+ @url = @channel.url
24
+ end
25
+
26
+ # Get the owner of this stream.
27
+ # @note This incurs an additional web request.
28
+ # @return [User] The user that owns this stream.
29
+ def user
30
+ @query.users.get(@channel.name)
31
+ end
32
+
33
+ # @example
34
+ # 6226912672
35
+ # @return [Fixnum] Unique Twitch ID.
36
+ attr_reader :id
37
+
38
+ # @example
39
+ # "fme", "xsplit", "obs", "rebroadcast", "delay", "unknown rtmp"
40
+ # @deprecated This attribute is not present in the V3 API.
41
+ # @return [String] The broadcasting software used for this stream.
42
+ attr_reader :broadcaster
43
+
44
+ # @example
45
+ # "Super Meat Boy"
46
+ # @return [String] The name of the game currently being streamed.
47
+ attr_reader :game_name
48
+
49
+ # @example
50
+ # "live_user_lethalfrag"
51
+ # @return [String] The unique Twitch name for this stream.
52
+ attr_reader :name
53
+
54
+ # @example
55
+ # 2342
56
+ # @return [Fixnum] The number of viewers currently watching the stream.
57
+ attr_reader :viewer_count
58
+
59
+ # @example
60
+ # "http://static-cdn.jtvnw.net/previews-ttv/live_user_lethalfrag-320x200.jpg"
61
+ # @return [String] URL of a preview screenshot taken from the video stream.
62
+ attr_reader :preview_url
63
+
64
+ # @note This does not incur any web requests.
65
+ # @return [Channel] The `Channel` associated with this stream.
66
+ attr_reader :channel
67
+
68
+ # @example
69
+ # "http://www.twitch.tv/lethalfrag"
70
+ # @return [String] The URL for this stream.
71
+ attr_reader :url
72
+ end
73
+
74
+ # Site-wide stream summary statistics.
75
+ # @see Streams#summary Streams#summary
76
+ class StreamSummary
77
+ # @private
78
+ def initialize(hash)
79
+ @viewer_count = hash['viewers']
80
+ @channel_count = hash['channels']
81
+ end
82
+
83
+ # @example
84
+ # 194774
85
+ # @return [Fixnum] The sum of all viewers across all live streams.
86
+ attr_reader :viewer_count
87
+
88
+ # @example
89
+ # 4144
90
+ # @return [Fixnum] The count of all channels currently streaming.
91
+ attr_reader :channel_count
92
+ end
93
+
94
+ # Query class for finding featured streams or streams meeting certain criteria.
95
+ # @see Stream
96
+ class Streams
97
+ # @private
98
+ def initialize(query)
99
+ @query = query
100
+ end
101
+
102
+ # Get a live stream by name.
103
+ # @example
104
+ # s = Twitch.streams.get('lagtvmaximusblack')
105
+ # s.nil? # => false (stream is live)
106
+ # s.game_name # => "StarCraft II: Heart of the Swarm"
107
+ # s.viewer_count # => 2403
108
+ # @example
109
+ # s = Twitch.streams.get('destiny')
110
+ # s.nil? # => true (stream is offline)
111
+ # @param stream_name [String] The name of the stream to get. This is the same as the channel or user name.
112
+ # @see #find
113
+ # @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/streams.md#get-streamschannel GET /streams/:channel
114
+ # @return [Stream] A valid `Stream` object, if the stream exists and is live.
115
+ # @return [nil] If the stream does not exist or is not live.
116
+ def get(stream_name)
117
+ name = CGI.escape(stream_name)
118
+
119
+ # HTTP 422 can happen if the stream is associated with a Justin.tv account.
120
+ Twitch::Status.map(404 => nil, 422 => nil) do
121
+ json = @query.connection.get("streams/#{name}")
122
+ stream = json['stream']
123
+ stream.nil? ? nil : Stream.new(stream, @query)
124
+ end
125
+ end
126
+
127
+ # Get all currently live streams.
128
+ # @example
129
+ # Twitch.streams.all
130
+ # @example
131
+ # Twitch.streams.all(:offset => 100, :limit => 10)
132
+ # @example
133
+ # Twitch.streams.all do |stream|
134
+ # next if stream.viewer_count < 1000
135
+ # puts stream.url
136
+ # end
137
+ # @param options [Hash] Limit criteria.
138
+ # @option options [Fixnum] :limit (nil) Limit on the number of results returned.
139
+ # @option options [Fixnum] :offset (0) Offset into the result set to begin enumeration.
140
+ # @yield Optional. If a block is given, each stream is yielded.
141
+ # @yieldparam [Stream] stream Current stream.
142
+ # @see #get
143
+ # @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/streams.md#get-streams GET /streams
144
+ # @return [Array<Stream>] Currently live streams, if no block is given.
145
+ # @return [nil] If a block is given.
146
+ def all(options = {}, &block)
147
+ return @query.connection.accumulate(
148
+ :path => 'streams',
149
+ :json => 'streams',
150
+ :create => -> hash { Stream.new(hash, @query) },
151
+ :limit => options[:limit],
152
+ :offset => options[:offset],
153
+ &block
154
+ )
155
+ end
156
+
157
+ # Get streams for a specific game, for a set of channels, or by other criteria.
158
+ # @example
159
+ # Twitch.streams.find(:game => 'League of Legends', :limit => 50)
160
+ # @example
161
+ # Twitch.streams.find(:channel => ['fgtvlive', 'incontroltv', 'destiny'])
162
+ # @example
163
+ # Twitch.streams.find(:game => 'Diablo III', :channel => ['nl_kripp', 'protech'])
164
+ # @example
165
+ # Twitch.streams.find(:game => 'League of Legends') do |stream|
166
+ # next if stream.viewer_count < 1000
167
+ # puts stream.url
168
+ # end
169
+ # @param options [Hash] Search criteria.
170
+ # @option options [String, Game, #name] :game Only return streams currently streaming the specified game.
171
+ # @option options [Array<String, Channel, #name>] :channel Only return streams for these channels.
172
+ # If a channel is not currently streaming, it is omitted. You must specify an array of channels
173
+ # or channel names. If you want to find the stream for a single channel, see {Streams#get}.
174
+ # @option options [Boolean] :embeddable (nil) If `true`, limit the streams to those that can be embedded. If `false` or `nil`, do not limit.
175
+ # @option options [Boolean] :hls (nil) If `true`, limit the streams to those using HLS (HTTP Live Streaming). If `false` or `nil`, do not limit.
176
+ # @option options [Fixnum] :limit (nil) Limit on the number of results returned.
177
+ # @option options [Fixnum] :offset (0) Offset into the result set to begin enumeration.
178
+ # @yield Optional. If a block is given, each stream found is yielded.
179
+ # @yieldparam [Stream] stream Current stream.
180
+ # @see #get
181
+ # @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/streams.md#get-streams GET /streams
182
+ # @raise [ArgumentError] If `options` does not specify a search criteria (`:game`, `:channel`, `:embeddable`, or `:hls`).
183
+ # @raise [ArgumentError] If `:channel` is not an array.
184
+ # @return [Array<Stream>] Streams matching the specified criteria, if no block is given.
185
+ # @return [nil] If a block is given.
186
+ def find(options, &block)
187
+ check = options.dup
188
+ check.delete(:limit)
189
+ check.delete(:offset)
190
+ raise ArgumentError, 'options' if check.empty?
191
+
192
+ params = {}
193
+
194
+ channels = options[:channel]
195
+ if channels
196
+ if !channels.respond_to?(:map)
197
+ raise ArgumentError, ':channel'
198
+ end
199
+
200
+ params[:channel] = channels.map { |channel|
201
+ if channel.respond_to?(:name)
202
+ channel.name
203
+ else
204
+ channel.to_s
205
+ end
206
+ }.join(',')
207
+ end
208
+
209
+ game = options[:game]
210
+ if game
211
+ if game.respond_to?(:name)
212
+ params[:game] = game.name
213
+ else
214
+ params[:game] = game.to_s
215
+ end
216
+ end
217
+
218
+ if options[:hls]
219
+ params[:hls] = true
220
+ end
221
+
222
+ if options[:embeddable]
223
+ params[:embeddable] = true
224
+ end
225
+
226
+ return @query.connection.accumulate(
227
+ :path => 'streams',
228
+ :params => params,
229
+ :json => 'streams',
230
+ :create => -> hash { Stream.new(hash, @query) },
231
+ :limit => options[:limit],
232
+ :offset => options[:offset],
233
+ &block
234
+ )
235
+ end
236
+
237
+ # Get the currently featured (promoted) streams. This includes the streams shown on the Twitch homepage.
238
+ # @note There is no guarantee of how many streams are featured at any given time.
239
+ # @example
240
+ # Twitch.streams.featured
241
+ # @example
242
+ # Twitch.streams.featured(:limit => 5)
243
+ # @example
244
+ # Twitch.streams.featured do |stream|
245
+ # next if stream.viewer_count < 1000
246
+ # puts stream.url
247
+ # end
248
+ # @param options [Hash] Filter criteria.
249
+ # @option options [Boolean] :hls (nil) If `true`, limit the streams to those using HLS (HTTP Live Streaming). If `false` or `nil`, do not limit.
250
+ # @option options [Fixnum] :limit (nil) Limit on the number of results returned.
251
+ # @option options [Fixnum] :offset (0) Offset into the result set to begin enumeration.
252
+ # @yield Optional. If a block is given, each featured stream is yielded.
253
+ # @yieldparam [Stream] stream Current stream.
254
+ # @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/streams.md#get-streamsfeatured GET /streams/featured
255
+ # @return [Array<Stream>] Featured streams, if no block is given.
256
+ # @return [nil] If a block is given.
257
+ def featured(options = {}, &block)
258
+ params = {}
259
+
260
+ if options[:hls]
261
+ params[:hls] = true
262
+ end
263
+
264
+ return @query.connection.accumulate(
265
+ :path => 'streams/featured',
266
+ :params => params,
267
+ :json => 'featured',
268
+ :sub_json => 'stream',
269
+ :create => -> hash { Stream.new(hash, @query) },
270
+ :limit => options[:limit],
271
+ :offset => options[:offset],
272
+ &block
273
+ )
274
+ end
275
+
276
+ # Get site-wide stream summary statistics.
277
+ # @example
278
+ # summary = Twitch.streams.summary
279
+ # summary.viewer_count # => 194774
280
+ # summary.channel_count # => 4144
281
+ # @see https://github.com/justintv/Twitch-API/blob/master/v2_resources/streams.md#gedt-streamssummary GET /streams/summary
282
+ # @return [StreamSummary] Stream summary statistics.
283
+ def summary
284
+ json = @query.connection.get('streams/summary')
285
+ StreamSummary.new(json)
286
+ end
287
+ end
288
+ end