twitchus 0.0.4 → 0.1.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/TODO +1 -0
- data/lib/twitchus/checker.rb +16 -6
- data/lib/twitchus/cli.rb +0 -2
- data/lib/twitchus/config.rb +2 -3
- data/lib/twitchus/version.rb +1 -1
- data/lib/twitchus/worker.rb +9 -9
- data/spec/spec_helper.rb +2 -5
- data/spec/twitchus/checker_spec.rb +25 -14
- data/spec/twitchus/config_spec.rb +10 -1
- data/twitchus.gemspec +0 -1
- metadata +5 -22
- data/spec/fixtures/vcr/justin_tv.yml +0 -136
data/TODO
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Figure out why there is a Service Unavailable exception and handle it accordingly. It should probably notify a exception logging service.
|
data/lib/twitchus/checker.rb
CHANGED
@@ -3,9 +3,12 @@ require "json"
|
|
3
3
|
|
4
4
|
module Twitchus
|
5
5
|
class Checker
|
6
|
+
def initialize(config = nil)
|
7
|
+
@config = config
|
8
|
+
end
|
6
9
|
|
7
|
-
def fetch_all(channels
|
8
|
-
channels.map { |channel| check(channel)
|
10
|
+
def fetch_all(channels)
|
11
|
+
channels.map { |channel| check(channel) }.select { |c| !c.nil? }
|
9
12
|
end
|
10
13
|
|
11
14
|
# Return a list of online channel names
|
@@ -15,11 +18,12 @@ module Twitchus
|
|
15
18
|
|
16
19
|
def check(channel)
|
17
20
|
raise ArgumentError, "Channel is required." unless channel
|
18
|
-
response =
|
21
|
+
response = RestClient.get(base_url + channel)
|
22
|
+
response = JSON.parse(response)
|
19
23
|
|
20
|
-
response
|
24
|
+
response["stream"]
|
21
25
|
rescue RestClient::BadRequest => e
|
22
|
-
$stderr.puts "
|
26
|
+
$stderr.puts "Request failed due to rate limit, channel: #{channel}, #{e}"
|
23
27
|
nil
|
24
28
|
end
|
25
29
|
|
@@ -27,8 +31,14 @@ module Twitchus
|
|
27
31
|
!check(channel).nil?
|
28
32
|
end
|
29
33
|
|
34
|
+
def url_for(channel)
|
35
|
+
url = base_url + channel
|
36
|
+
url += "?client_key=#{@config.client_key}" if @config
|
37
|
+
url
|
38
|
+
end
|
39
|
+
|
30
40
|
def base_url
|
31
|
-
"
|
41
|
+
"https://api.twitch.tv/kraken/streams/"
|
32
42
|
end
|
33
43
|
end
|
34
44
|
end
|
data/lib/twitchus/cli.rb
CHANGED
data/lib/twitchus/config.rb
CHANGED
data/lib/twitchus/version.rb
CHANGED
data/lib/twitchus/worker.rb
CHANGED
@@ -3,22 +3,22 @@ module Twitchus
|
|
3
3
|
def initialize(config_file)
|
4
4
|
@config = Twitchus::Config.new
|
5
5
|
@config.load(config_file)
|
6
|
-
@checker = Twitchus::Checker.new
|
6
|
+
@checker = Twitchus::Checker.new(@config)
|
7
7
|
end
|
8
8
|
|
9
9
|
def run
|
10
10
|
@storage = Twitchus::Storage.new(@config.host, @config.port, @config.key)
|
11
|
-
#
|
11
|
+
# Since this can run periodically, clean the list first
|
12
12
|
@storage.clear
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
online_streams = @checker.fetch_all(@config.streams)
|
15
|
+
online_streams.each do |data|
|
16
|
+
channel = data["channel"]
|
18
17
|
data = {
|
19
|
-
|
20
|
-
channel
|
21
|
-
image:
|
18
|
+
title: channel["status"],
|
19
|
+
name: channel["name"],
|
20
|
+
image: channel["banner"],
|
21
|
+
preview: data["preview"]
|
22
22
|
}
|
23
23
|
|
24
24
|
@storage.push data.to_json
|
data/spec/spec_helper.rb
CHANGED
@@ -3,30 +3,41 @@ require "spec_helper"
|
|
3
3
|
module Twitchus
|
4
4
|
|
5
5
|
describe Checker do
|
6
|
+
context "without a config" do
|
7
|
+
let(:checker) { Checker.new }
|
6
8
|
|
7
|
-
|
9
|
+
it "can tell if a channel is online" do
|
10
|
+
stub_request(:get, "https://api.twitch.tv/kraken/streams/scvrush1")
|
11
|
+
.to_return(status: 200, body: { "stream" => {} }.to_json)
|
8
12
|
|
9
|
-
|
10
|
-
VCR.use_cassette "justin.tv", record: :new_episodes do
|
11
|
-
c.should be_online("dreamhacktv")
|
13
|
+
checker.should be_online("scvrush1")
|
12
14
|
end
|
13
|
-
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
16
|
+
it "can tell if a channel is offline" do
|
17
|
+
stub_request(:get, "https://api.twitch.tv/kraken/streams/scvrush1")
|
18
|
+
.to_return(status: 200, body: { "stream" => nil }.to_json)
|
19
|
+
|
20
|
+
checker.should_not be_online("scvrush1")
|
21
|
+
end
|
22
|
+
|
23
|
+
it "selects online streams from a list" do
|
24
|
+
stub_request(:get, "https://api.twitch.tv/kraken/streams/online")
|
25
|
+
.to_return(status: 200, body: { "stream" => { "name" => "online"} }.to_json)
|
26
|
+
stub_request(:get, "https://api.twitch.tv/kraken/streams/offline")
|
27
|
+
.to_return(status: 200, body: { "stream" => nil }.to_json)
|
28
|
+
|
29
|
+
checker.fetch_all(%w(online offline)).should == [ { "name" => "online" } ]
|
18
30
|
end
|
19
31
|
end
|
20
32
|
|
21
|
-
|
33
|
+
context "with a config" do
|
34
|
+
let(:config) { Struct.new(:client_key).new("foobarkey") }
|
35
|
+
let(:checker) { Checker.new(config) }
|
22
36
|
|
23
|
-
it "
|
24
|
-
|
25
|
-
c.check_all(%w{dreamhacktv scvrush1}).should == ["dreamhacktv"]
|
26
|
-
end
|
37
|
+
it "appends the client key to base_url" do
|
38
|
+
checker.url_for("scvrush1").should == "https://api.twitch.tv/kraken/streams/scvrush1?client_key=foobarkey"
|
27
39
|
end
|
28
40
|
end
|
29
41
|
|
30
42
|
end
|
31
|
-
|
32
43
|
end
|
@@ -6,7 +6,7 @@ module Twitchus
|
|
6
6
|
|
7
7
|
let(:config) { Config.new }
|
8
8
|
|
9
|
-
it "
|
9
|
+
it "load config with multiple streams" do
|
10
10
|
file =<<YAML
|
11
11
|
streams:
|
12
12
|
- scvrush1
|
@@ -17,5 +17,14 @@ YAML
|
|
17
17
|
config.streams.should == %w{scvrush1 scvrush2}
|
18
18
|
end
|
19
19
|
|
20
|
+
it "loads client key" do
|
21
|
+
file =<<YAML
|
22
|
+
client_key: foo
|
23
|
+
YAML
|
24
|
+
File.write("./tmp/config.yml", file)
|
25
|
+
config.load("./tmp/config.yml")
|
26
|
+
config.client_key.should == "foo"
|
27
|
+
end
|
28
|
+
|
20
29
|
end
|
21
30
|
end
|
data/twitchus.gemspec
CHANGED
@@ -21,7 +21,6 @@ Gem::Specification.new do |gem|
|
|
21
21
|
gem.add_dependency "redis", "~> 3.0.1"
|
22
22
|
|
23
23
|
gem.add_development_dependency "webmock", "~> 1.8.10"
|
24
|
-
gem.add_development_dependency "vcr", "~> 2.2.5"
|
25
24
|
gem.add_development_dependency "pry", "~> 0.9.10"
|
26
25
|
gem.add_development_dependency "rake", "~> 0.9.2.2"
|
27
26
|
gem.add_development_dependency "rspec", "~> 2.11.0"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twitchus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-client
|
@@ -59,22 +59,6 @@ dependencies:
|
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: 1.8.10
|
62
|
-
- !ruby/object:Gem::Dependency
|
63
|
-
name: vcr
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
|
-
requirements:
|
67
|
-
- - ~>
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: 2.2.5
|
70
|
-
type: :development
|
71
|
-
prerelease: false
|
72
|
-
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
|
-
requirements:
|
75
|
-
- - ~>
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: 2.2.5
|
78
62
|
- !ruby/object:Gem::Dependency
|
79
63
|
name: pry
|
80
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -169,6 +153,7 @@ files:
|
|
169
153
|
- LICENSE.txt
|
170
154
|
- README.md
|
171
155
|
- Rakefile
|
156
|
+
- TODO
|
172
157
|
- bin/twitchus
|
173
158
|
- config.example.yml
|
174
159
|
- features/config.feature
|
@@ -180,7 +165,6 @@ files:
|
|
180
165
|
- lib/twitchus/storage.rb
|
181
166
|
- lib/twitchus/version.rb
|
182
167
|
- lib/twitchus/worker.rb
|
183
|
-
- spec/fixtures/vcr/justin_tv.yml
|
184
168
|
- spec/spec_helper.rb
|
185
169
|
- spec/twitchus/checker_spec.rb
|
186
170
|
- spec/twitchus/cli_spec.rb
|
@@ -203,7 +187,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
203
187
|
version: '0'
|
204
188
|
segments:
|
205
189
|
- 0
|
206
|
-
hash: -
|
190
|
+
hash: -2009003698380875512
|
207
191
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
208
192
|
none: false
|
209
193
|
requirements:
|
@@ -212,7 +196,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
212
196
|
version: '0'
|
213
197
|
segments:
|
214
198
|
- 0
|
215
|
-
hash: -
|
199
|
+
hash: -2009003698380875512
|
216
200
|
requirements: []
|
217
201
|
rubyforge_project:
|
218
202
|
rubygems_version: 1.8.23
|
@@ -222,7 +206,6 @@ summary: Twitchus is a gem for managing a list of Twitch.tv streams
|
|
222
206
|
test_files:
|
223
207
|
- features/config.feature
|
224
208
|
- features/support/env.rb
|
225
|
-
- spec/fixtures/vcr/justin_tv.yml
|
226
209
|
- spec/spec_helper.rb
|
227
210
|
- spec/twitchus/checker_spec.rb
|
228
211
|
- spec/twitchus/cli_spec.rb
|
@@ -1,136 +0,0 @@
|
|
1
|
-
---
|
2
|
-
http_interactions:
|
3
|
-
- request:
|
4
|
-
method: get
|
5
|
-
uri: http://api.justin.tv/api/stream/list.json?channel=dreamhacktv
|
6
|
-
body:
|
7
|
-
encoding: US-ASCII
|
8
|
-
string: ''
|
9
|
-
headers:
|
10
|
-
Accept:
|
11
|
-
- ! '*/*; q=0.5, application/xml'
|
12
|
-
Accept-Encoding:
|
13
|
-
- gzip, deflate
|
14
|
-
User-Agent:
|
15
|
-
- Ruby
|
16
|
-
response:
|
17
|
-
status:
|
18
|
-
code: 200
|
19
|
-
message: !binary |-
|
20
|
-
T0s=
|
21
|
-
headers:
|
22
|
-
!binary "U2VydmVy":
|
23
|
-
- !binary |-
|
24
|
-
bmdpbng=
|
25
|
-
!binary "RGF0ZQ==":
|
26
|
-
- !binary |-
|
27
|
-
U3VuLCAyMyBTZXAgMjAxMiAxNTo1MDozMiBHTVQ=
|
28
|
-
!binary "Q29udGVudC1UeXBl":
|
29
|
-
- !binary |-
|
30
|
-
YXBwbGljYXRpb24vanNvbg==
|
31
|
-
!binary "VHJhbnNmZXItRW5jb2Rpbmc=":
|
32
|
-
- !binary |-
|
33
|
-
Y2h1bmtlZA==
|
34
|
-
!binary "Q29ubmVjdGlvbg==":
|
35
|
-
- !binary |-
|
36
|
-
Y2xvc2U=
|
37
|
-
!binary "U3RhdHVz":
|
38
|
-
- !binary |-
|
39
|
-
MjAwIE9L
|
40
|
-
!binary "Vmlh":
|
41
|
-
- !binary |-
|
42
|
-
VHdpY2UgMC4yIHdlYjExOjMzNDc=
|
43
|
-
!binary "WC1SdW50aW1l":
|
44
|
-
- !binary |-
|
45
|
-
MC4wMjQ4NjA=
|
46
|
-
!binary "WC1VYS1Db21wYXRpYmxl":
|
47
|
-
- !binary |-
|
48
|
-
SUU9RWRnZSxjaHJvbWU9MQ==
|
49
|
-
!binary "Q2FjaGUtQ29udHJvbA==":
|
50
|
-
- !binary |-
|
51
|
-
bWF4LWFnZT0wLCBwcml2YXRlLCBtdXN0LXJldmFsaWRhdGU=
|
52
|
-
!binary "WC1HZW8=":
|
53
|
-
- !binary |-
|
54
|
-
Q1o=
|
55
|
-
!binary "RnJvbnQtRW5kLUh0dHBz":
|
56
|
-
- !binary |-
|
57
|
-
b2Zm
|
58
|
-
!binary "Q29udGVudC1FbmNvZGluZw==":
|
59
|
-
- !binary |-
|
60
|
-
Z3ppcA==
|
61
|
-
body:
|
62
|
-
encoding: ASCII-8BIT
|
63
|
-
string: !binary |-
|
64
|
-
H4sIAAAAAAAAA7VWbW/bNhD+KwIH9JNtvdmWLTQdgr5sAYrlg7EO2zIIlHSS
|
65
|
-
mFKkQJGWvaH/fUcpipQsWFMENSDAlO6Od8899/LnPwTqFPIkk0ZoEpOtt16T
|
66
|
-
BRG0BjxxdoTEtKCSXAGtK5p91kf83Gp7vFfyg2gb4OuMaiilOqNmSWsmSnxX
|
67
|
-
SFVTa9nasjIVFQL4qLvZ+n60IJppbi98Z+3+jNc476/+uHauGxCx84lyEBmj
|
68
|
-
zoerXy4/Ou8uf7d2gWqjICexVgbQJaZhiiLydyhDU/Q9UdBIpa1kQXmLoncu
|
69
|
-
kHgMHgRN+cxUpgBEktEmMYonNeTM1OhcpXUTu26rqWbZMsvF6lYfRbcSoN1G
|
70
|
-
wZFB17pPQrb0N97J98PVbWMxGaO9LgqGcXFnCvvQI4syCBqGR2JhOJ+QTUbV
|
71
|
-
n0Z8W5NOsD8UnqdhzHJuUXbw91qmt5BpR58buLghtGk4Q0NMCve0bCuZfe7o
|
72
|
-
EZYFp211Q5wKWFlpFAz2Gzx2LNcVnsJNiCeW498+8OGahtMzcmbUzammKHAH
|
73
|
-
X9d1q1vTaiZW+uiioRL0HWxz7VXbFT/eZepixj68Li0zyaVCkz94/e+GvHnd
|
74
|
-
UEVrx/LWRsO57D4gcoc+lahzpNzYL5YseHSfUmgzxRpNswzadqZCeUfP9sVj
|
75
|
-
pVpiymeC3x7gE0Z70I5UPfDAaJlYUC96Br96ApZXyEqlk6PkBhEIbI7QXXdI
|
76
|
-
8psbgYzC8Oa0bmtE6WWsjrzTZuQ0q2mJvQLr5TmGsXCGvtKwzPK8dWcpXjZK
|
77
|
-
FoxD0ttcbmC/XYdB5EOR5Wm4X+K1kYelBLaWbDWa9ptah2Y1/C2FrYT3RskG
|
78
|
-
3INGvleS28KbFdRYbUNZTRFWprTK/9cPXhTg1vNO+IwhIhy5yUCNrW5yBIvI
|
79
|
-
Ntvv5gh2rc29Gww7aOCH3hZbwIJMTnCqvi8cIcKBzwjHOEGQa1PsD7vKo2n1
|
80
|
-
kPjPyN5Xuvk29E7raGQ+p6I0SFR0Bmyd9XNgmo17LwiitY8fJsieNVJeRKF+
|
81
|
-
4Ey5e1T7z0nZVzAIA+8UrG1S+olGS6zBoU64LJlAMOZJ+GJhyUEmwxwhcRR4
|
82
|
-
C/Jf5KxIyrTCRQLJtg3DVeB7+zCyhEP6kXC3Cfz1Pth5eGkNmia4aFjkD9j+
|
83
|
-
3ipaaOfqKnZ+w92jdWThfGQpKH1G4VRJmme01baOSIFKs3cJTg/cUUJcGUzO
|
84
|
-
JCYvhwzF6iZEMdNgIxhuMcI5QOMEoeNt4rUXr/dO4Pl29xnC6+ciiX10cEFK
|
85
|
-
kGjj1wN+HTlruTFSw99tvV24w+1n/IqtZ5hBOIXvt5VhKD5eUYYFzA5vvOJu
|
86
|
-
tRpcGH2//PSWfPnrX1m4nUXhCQAA
|
87
|
-
http_version:
|
88
|
-
recorded_at: Sun, 23 Sep 2012 15:50:32 GMT
|
89
|
-
- request:
|
90
|
-
method: get
|
91
|
-
uri: http://api.justin.tv/api/stream/list.json?channel=scvrush1
|
92
|
-
body:
|
93
|
-
encoding: US-ASCII
|
94
|
-
string: ''
|
95
|
-
headers:
|
96
|
-
Accept:
|
97
|
-
- ! '*/*; q=0.5, application/xml'
|
98
|
-
Accept-Encoding:
|
99
|
-
- gzip, deflate
|
100
|
-
User-Agent:
|
101
|
-
- Ruby
|
102
|
-
response:
|
103
|
-
status:
|
104
|
-
code: 200
|
105
|
-
message: OK
|
106
|
-
headers:
|
107
|
-
Server:
|
108
|
-
- nginx
|
109
|
-
Date:
|
110
|
-
- Sun, 23 Sep 2012 15:51:43 GMT
|
111
|
-
Content-Type:
|
112
|
-
- application/json
|
113
|
-
Content-Length:
|
114
|
-
- '2'
|
115
|
-
Connection:
|
116
|
-
- close
|
117
|
-
Status:
|
118
|
-
- 200 OK
|
119
|
-
Via:
|
120
|
-
- Twice 0.2 web9:3347
|
121
|
-
X-Runtime:
|
122
|
-
- '0.014319'
|
123
|
-
X-Ua-Compatible:
|
124
|
-
- IE=Edge,chrome=1
|
125
|
-
Cache-Control:
|
126
|
-
- max-age=0, private, must-revalidate
|
127
|
-
X-Geo:
|
128
|
-
- CZ
|
129
|
-
Front-End-Https:
|
130
|
-
- 'off'
|
131
|
-
body:
|
132
|
-
encoding: US-ASCII
|
133
|
-
string: ! '[]'
|
134
|
-
http_version:
|
135
|
-
recorded_at: Sun, 23 Sep 2012 15:51:44 GMT
|
136
|
-
recorded_with: VCR 2.2.5
|