piliv2 2.0.3 → 2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +102 -48
- data/example/example.rb +52 -20
- data/lib/pili/client.rb +10 -10
- data/lib/pili/hub.rb +37 -9
- data/lib/pili/stream.rb +61 -18
- data/lib/pili/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e29f840b9bfc8601baef9f0eeb269f749f44bf9b
|
4
|
+
data.tar.gz: 11edb606403b266ab39019f8d333e5c9bfa930d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94f7c701a0cb574b2d6416de406c000101463dbaa30d84e173a1eba0342f6eb75c30c71d805e99f66ea81fcd9a2357671138bfc25a673effe7c756d6bc20e087
|
7
|
+
data.tar.gz: f2b9006641bd119ef7ece200293e9c64c1ef368e67590f86b42d4bd102ca635bb33e14da5e64548ea7d2e7611544105a2fbb9d656e0dd1ccb11cb82218d14479
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
## CHANGE LOG
|
2
2
|
|
3
|
+
### v2.1.0
|
4
|
+
[#35](https://github.com/pili-engineering/pili-sdk-ruby/pull/35)
|
5
|
+
- 增加批量查询直播信息接口
|
6
|
+
- 回放保存增加更多的配置项
|
7
|
+
- 增加保存截图接口
|
8
|
+
- 增加更改流转码规格接口
|
9
|
+
|
3
10
|
### v2.0.3
|
4
11
|
|
5
12
|
- 修复 README 错误和修改 `RPCError` 继承自 `RuntimeError`。[#33](https://github.com/pili-engineering/pili-sdk-ruby/pull/33)
|
data/README.md
CHANGED
@@ -3,22 +3,26 @@
|
|
3
3
|
## Features
|
4
4
|
|
5
5
|
- URL
|
6
|
-
- [x] RTMP推流地址: rtmp_publish_url(domain, hub,
|
7
|
-
- [x] RTMP直播地址: rtmp_play_url(domain, hub,
|
8
|
-
- [x] HLS直播地址: hls_play_url(domain, hub,
|
9
|
-
- [x] HDL直播地址: hdl_play_url(domain, hub,
|
10
|
-
- [x]
|
6
|
+
- [x] RTMP推流地址: rtmp_publish_url(domain, hub, stream_title, mac, expire_after_seconds)
|
7
|
+
- [x] RTMP直播地址: rtmp_play_url(domain, hub, stream_title)
|
8
|
+
- [x] HLS直播地址: hls_play_url(domain, hub, stream_title)
|
9
|
+
- [x] HDL直播地址: hdl_play_url(domain, hub, stream_title)
|
10
|
+
- [x] 直播封面地址: snapshot_play_url(domain, hub, stream_title)
|
11
11
|
- Hub
|
12
|
-
- [x] 创建流: hub.create(
|
13
|
-
- [x] 获得流: hub.stream(
|
12
|
+
- [x] 创建流: hub.create(stream_title)
|
13
|
+
- [x] 获得流: hub.stream(stream_title)
|
14
14
|
- [x] 列出流: hub.list(...)
|
15
15
|
- [x] 列出正在直播的流: hub.list_live(...)
|
16
|
+
- [x] 批量查询直播信息: hub.batch_query_live_status(stream_titles)
|
16
17
|
- Stream
|
17
18
|
- [x] 流信息: stream.info()
|
18
|
-
- [x]
|
19
|
+
- [x] 无限期禁用流: stream.disable()
|
20
|
+
- [x] 禁用流: stream.disable_till(timestamp)
|
19
21
|
- [x] 启用流: stream.enable()
|
20
22
|
- [x] 查询直播状态: stream.live_status()
|
21
|
-
- [x] 保存直播回放: stream.
|
23
|
+
- [x] 保存直播回放: stream.saveas(...)
|
24
|
+
- [x] 保存直播截图: stream.snapshot(...)
|
25
|
+
- [x] 更改流的实时转码规格: stream.update_converts(profiles)
|
22
26
|
- [x] 查询直播历史: stream.history_activity(...)
|
23
27
|
|
24
28
|
## Contents
|
@@ -38,13 +42,17 @@
|
|
38
42
|
- [Get a Stream](#get-a-stream)
|
39
43
|
- [List Streams](#list-streams)
|
40
44
|
- [List live Streams](#list-live-streams)
|
45
|
+
- [Batch query live status](#batch-query-live-status)
|
41
46
|
- [Stream](#stream)
|
42
47
|
- [Get Stream info](#get-stream-info)
|
43
48
|
- [Disable a Stream](#disable-a-stream)
|
49
|
+
- [Disable a Stream with timestamp](#disable-a-stream-with-timestamp)
|
44
50
|
- [Enable a Stream](#enable-a-stream)
|
45
51
|
- [Get Stream live status](#get-stream-live-status)
|
46
|
-
- [Get Stream history activity](#get-stream-history-activity)
|
47
52
|
- [Save Stream live playback](#save-stream-live-playback)
|
53
|
+
- [Save Stream snapshot](#save-stream-snapshot)
|
54
|
+
- [Update converts](#update-converts)
|
55
|
+
- [Get Stream history activity](#get-stream-history-activity)
|
48
56
|
|
49
57
|
## Installation
|
50
58
|
|
@@ -82,41 +90,41 @@ hub = client.hub(hub_name)
|
|
82
90
|
#### Generate RTMP publish URL
|
83
91
|
|
84
92
|
```ruby
|
85
|
-
url = Pili.rtmp_publish_url("publish-rtmp.test.com", "PiliSDKTest", "
|
93
|
+
url = Pili.rtmp_publish_url("publish-rtmp.test.com", "PiliSDKTest", "streamtitle", mac, 60)
|
86
94
|
puts(url)
|
87
|
-
# rtmp://publish-rtmp.test.com/PiliSDKTest/
|
95
|
+
# rtmp://publish-rtmp.test.com/PiliSDKTest/streamtitle?e=1463023142&token=7O7hf7Ld1RrC_fpZdFvU8aCgOPuhw2K4eapYOdII:-5IVlpFNNGJHwv-2qKwVIakC0ME=
|
88
96
|
```
|
89
97
|
|
90
98
|
#### Generate RTMP play URL
|
91
99
|
|
92
100
|
```ruby
|
93
|
-
url = Pili.rtmp_play_url("live-rtmp.test.com", "PiliSDKTest", "
|
101
|
+
url = Pili.rtmp_play_url("live-rtmp.test.com", "PiliSDKTest", "streamtitle")
|
94
102
|
puts(url)
|
95
|
-
# rtmp://live-rtmp.test.com/PiliSDKTest/
|
103
|
+
# rtmp://live-rtmp.test.com/PiliSDKTest/streamtitle
|
96
104
|
```
|
97
105
|
|
98
106
|
#### Generate HLS play URL
|
99
107
|
|
100
108
|
```ruby
|
101
|
-
url = Pili.hls_play_url("live-hls.test.com", "PiliSDKTest", "
|
109
|
+
url = Pili.hls_play_url("live-hls.test.com", "PiliSDKTest", "streamtitle")
|
102
110
|
puts(url)
|
103
|
-
# http://live-hls.test.com/PiliSDKTest/
|
111
|
+
# http://live-hls.test.com/PiliSDKTest/streamtitle.m3u8
|
104
112
|
```
|
105
113
|
|
106
114
|
#### Generate HDL play URL
|
107
115
|
|
108
116
|
```ruby
|
109
|
-
url = Pili.hdl_play_url("live-hdl.test.com", "PiliSDKTest", "
|
117
|
+
url = Pili.hdl_play_url("live-hdl.test.com", "PiliSDKTest", "streamtitle")
|
110
118
|
puts(url)
|
111
|
-
# http://live-hdl.test.com/PiliSDKTest/
|
119
|
+
# http://live-hdl.test.com/PiliSDKTest/streamtitle.flv
|
112
120
|
```
|
113
121
|
|
114
122
|
#### Generate Snapshot play URL
|
115
123
|
|
116
124
|
```ruby
|
117
|
-
url = Pili.snapshot_play_url("live-snapshot.test.com", "PiliSDKTest", "
|
125
|
+
url = Pili.snapshot_play_url("live-snapshot.test.com", "PiliSDKTest", "streamtitle")
|
118
126
|
puts(url)
|
119
|
-
# http://live-snapshot.test.com/PiliSDKTest/
|
127
|
+
# http://live-snapshot.test.com/PiliSDKTest/streamtitle.jpg
|
120
128
|
```
|
121
129
|
|
122
130
|
### Hub
|
@@ -132,33 +140,42 @@ hub = client.hub("PiliSDKTest")
|
|
132
140
|
#### Create a new Stream
|
133
141
|
|
134
142
|
```ruby
|
135
|
-
stream = hub.create("
|
143
|
+
stream = hub.create("streamtitle")
|
136
144
|
puts(stream.info.to_json)
|
137
|
-
# {"hub":"PiliSDKTest","key":"
|
145
|
+
# {"hub":"PiliSDKTest","key":"streamtitle","disabled":false}
|
138
146
|
```
|
139
147
|
|
140
148
|
#### Get a Stream
|
141
149
|
|
142
150
|
```ruby
|
143
|
-
stream = hub.stream("
|
151
|
+
stream = hub.stream("streamtitle")
|
144
152
|
puts(stream.info.to_json)
|
145
|
-
# {"hub":"PiliSDKTest","key":"
|
153
|
+
# {"hub":"PiliSDKTest","key":"streamtitle","disabled":false}
|
146
154
|
```
|
147
155
|
|
148
156
|
#### List Streams
|
149
157
|
|
150
158
|
```ruby
|
151
|
-
|
152
|
-
puts
|
153
|
-
# [<
|
159
|
+
titles, marker = hub.list(:prefix=>"str", :limit=>10)
|
160
|
+
puts titles.to_s, marker
|
161
|
+
# [<titles...>], <marker>
|
154
162
|
```
|
155
163
|
|
156
164
|
#### List live Streams
|
157
165
|
|
158
166
|
```ruby
|
159
|
-
|
160
|
-
puts
|
161
|
-
# [<
|
167
|
+
titles, marker = hub.list_live(:prefix=>"str", :limit=>10)
|
168
|
+
puts titles.to_s, marker
|
169
|
+
# [<titles...>], <marker>
|
170
|
+
```
|
171
|
+
|
172
|
+
#### Batch query live status
|
173
|
+
|
174
|
+
```ruby
|
175
|
+
live_statuses = hub.batch_query_live_status(["stream1", "stream2"])
|
176
|
+
puts live_statuses
|
177
|
+
# {"startAt"=>1488798455, "clientIP"=>"119.130.107.231:35018", "bps"=>921960, "fps"=>{"audio"=>44, "video"=>29, "data"=>0}, "key"=>"stream1"}
|
178
|
+
# {"startAt"=>1488798287, "clientIP"=>"119.130.107.231:55924", "bps"=>867328, "fps"=>{"audio"=>42, "video"=>9, "data"=>0}, "key"=>"stream2"}
|
162
179
|
```
|
163
180
|
|
164
181
|
### Stream
|
@@ -166,37 +183,56 @@ puts keys.to_s, marker
|
|
166
183
|
#### Get Stream info
|
167
184
|
|
168
185
|
```ruby
|
169
|
-
stream = hub.stream(
|
186
|
+
stream = hub.stream(title)
|
170
187
|
puts(stream.info.to_json)
|
171
|
-
# {"hub": "PiliSDKTest", "key": "
|
188
|
+
# {"hub": "PiliSDKTest", "key": "streamtitle", "disabled": false}
|
172
189
|
```
|
173
190
|
|
174
191
|
#### Disable a Stream
|
175
192
|
|
176
193
|
```ruby
|
177
|
-
stream = hub.stream("
|
194
|
+
stream = hub.stream("streamtitle")
|
178
195
|
puts("before disable: #{stream.info.to_json}")
|
179
196
|
|
180
197
|
stream.disable()
|
181
198
|
|
182
|
-
stream = hub.stream("
|
199
|
+
stream = hub.stream("streamtitle")
|
183
200
|
puts("after disable: #{stream.info.to_json}")
|
184
|
-
# before disable: {"hub":"PiliSDKTest","key":"
|
185
|
-
# after disable: {"hub":"PiliSDKTest","key":"
|
201
|
+
# before disable: {"hub":"PiliSDKTest","key":"streamtitle","disabled":false}
|
202
|
+
# after disable: {"hub":"PiliSDKTest","key":"streamtitle","disabled":true}
|
203
|
+
```
|
204
|
+
|
205
|
+
#### Disable a Stream with timestamp
|
206
|
+
|
207
|
+
```ruby
|
208
|
+
stream = hub.stream("streamtitle")
|
209
|
+
puts("before disable: #{stream.info.to_json}")
|
210
|
+
|
211
|
+
stream.disable_till(Time.now.to_i + 10)
|
212
|
+
|
213
|
+
puts("after disable: #{stream.info.to_json}")
|
214
|
+
|
215
|
+
sleep(10)
|
216
|
+
|
217
|
+
puts("after 10 seconds: #{stream.info.to_json}")
|
218
|
+
|
219
|
+
# before disable: {"hub":"PiliSDKTest","key":"streamtitle","disabled":false}
|
220
|
+
# after disable: {"hub":"PiliSDKTest","key":"streamtitle","disabled":true}
|
221
|
+
# before 10 seconds: {"hub":"PiliSDKTest","key":"streamtitle","disabled":false}
|
186
222
|
```
|
187
223
|
|
188
224
|
#### Enable a Stream
|
189
225
|
|
190
226
|
```ruby
|
191
|
-
stream = hub.stream("
|
227
|
+
stream = hub.stream("streamtitle")
|
192
228
|
puts("before enable: #{stream.info.to_json}")
|
193
229
|
|
194
230
|
stream.enable()
|
195
231
|
|
196
|
-
stream = hub.get("
|
232
|
+
stream = hub.get("streamtitle")
|
197
233
|
puts("after enable: #{stream.info.to_json}")
|
198
|
-
# before disable: {"hub":"PiliSDKTest","key":"
|
199
|
-
# after disable: {"hub":"PiliSDKTest","key":"
|
234
|
+
# before disable: {"hub":"PiliSDKTest","key":"streamtitle","disabled":true}
|
235
|
+
# after disable: {"hub":"PiliSDKTest","key":"streamtitle","disabled":false}
|
200
236
|
```
|
201
237
|
|
202
238
|
#### Get Stream live status
|
@@ -207,18 +243,36 @@ puts(status.to_json)
|
|
207
243
|
# {"startAt":1463022236,"clientIP":"222.73.202.226","bps":248,"fps":{"audio":45,"vedio":28,"data":0}}
|
208
244
|
```
|
209
245
|
|
210
|
-
####
|
246
|
+
#### Save Stream live playback
|
211
247
|
|
212
248
|
```ruby
|
213
|
-
|
214
|
-
puts(
|
215
|
-
#
|
249
|
+
fname, persistentID = stream.saveas(:format => "mp4")
|
250
|
+
puts(fname, persistentID)
|
251
|
+
# recordings/z1.PiliSDKTest.streamtitle/1463156847_1463157463.mp4
|
252
|
+
# z1.58bd753a8a3c0c3794a1d6ff
|
253
|
+
```
|
254
|
+
#### Save Stream snapshot
|
255
|
+
```ruby
|
256
|
+
fname = stream.snapshot()
|
257
|
+
puts(fname)
|
258
|
+
# stream-title-4532162526321415963.jpg
|
216
259
|
```
|
217
260
|
|
218
|
-
####
|
261
|
+
#### Update converts
|
219
262
|
|
220
263
|
```ruby
|
221
|
-
|
222
|
-
puts
|
223
|
-
|
264
|
+
stream = hub.stream("streamtitle")
|
265
|
+
puts stream.info.to_json
|
266
|
+
stream.update_converts(["720p", "480p"])
|
267
|
+
puts stream.info.to_json
|
268
|
+
# {"hub":"PiliSDKTest","key":"streamtitle","disabled":false,"converts":[]}
|
269
|
+
# {"hub":"PiliSDKTest","key":"streamtitle","disabled":false,"converts":["720p","480p"]}
|
224
270
|
```
|
271
|
+
|
272
|
+
#### Get Stream history activity
|
273
|
+
|
274
|
+
```ruby
|
275
|
+
activity = stream.history_activity()
|
276
|
+
puts(activity.to_json)
|
277
|
+
# [{"start":1463022236,"end":1463022518}]
|
278
|
+
```
|
data/example/example.rb
CHANGED
@@ -10,7 +10,7 @@ if access_key == nil || secret_key == nil
|
|
10
10
|
end
|
11
11
|
|
12
12
|
srand
|
13
|
-
|
13
|
+
stream_title_prefix = "ruby-sdkexample-#{rand 1000000000}"
|
14
14
|
|
15
15
|
puts "初始化 client."
|
16
16
|
mac = Pili::Mac.new access_key, secret_key
|
@@ -18,50 +18,54 @@ client = Pili::Client.new mac
|
|
18
18
|
hub = client.hub hub_name
|
19
19
|
|
20
20
|
puts "获得不存在的流."
|
21
|
-
|
21
|
+
title_a = stream_title_prefix + "-a"
|
22
22
|
begin
|
23
|
-
stream_a = hub.stream
|
23
|
+
stream_a = hub.stream title_a
|
24
24
|
stream_a.info
|
25
25
|
rescue Pili::ResourceNotExist => e
|
26
26
|
puts e
|
27
27
|
end
|
28
28
|
|
29
29
|
puts "创建流."
|
30
|
-
stream_a = hub.create(
|
30
|
+
stream_a = hub.create(title_a)
|
31
31
|
puts stream_a.info
|
32
32
|
|
33
33
|
puts "获得流."
|
34
|
-
stream_a = hub.stream(
|
34
|
+
stream_a = hub.stream(title_a)
|
35
35
|
puts "to_json: #{stream_a.info.to_json}"
|
36
36
|
|
37
37
|
puts "创建重复的流."
|
38
38
|
begin
|
39
|
-
hub.create(
|
39
|
+
hub.create(title_a)
|
40
40
|
rescue Pili::ResourceConflict => e
|
41
41
|
puts e
|
42
42
|
end
|
43
43
|
|
44
44
|
puts "创建另一路流."
|
45
|
-
|
46
|
-
stream_b = hub.create(
|
45
|
+
title_b = stream_title_prefix + "-b"
|
46
|
+
stream_b = hub.create(title_b)
|
47
47
|
puts stream_b.info
|
48
48
|
|
49
49
|
puts "列出所有流."
|
50
50
|
begin
|
51
|
-
|
52
|
-
puts
|
51
|
+
titles, marker = hub.list(:prefix=>stream_title_prefix)
|
52
|
+
puts titles.to_s, marker
|
53
53
|
rescue Pili::ResourceNotExist => e
|
54
54
|
puts e
|
55
55
|
end
|
56
56
|
|
57
57
|
puts "列出正在直播的流."
|
58
58
|
begin
|
59
|
-
|
60
|
-
puts
|
59
|
+
titles, marker = hub.list_live(:prefix=>stream_title_prefix)
|
60
|
+
puts titles.to_s, marker
|
61
61
|
rescue Pili::ResourceNotExist => e
|
62
62
|
puts e
|
63
63
|
end
|
64
64
|
|
65
|
+
puts "批量查询直播信息."
|
66
|
+
live_statuses = hub.batch_query_live_status([title_a, title_b])
|
67
|
+
puts live_statuses
|
68
|
+
|
65
69
|
puts "禁用流."
|
66
70
|
stream_a.disable()
|
67
71
|
puts stream_a.info
|
@@ -70,42 +74,70 @@ puts "启用流."
|
|
70
74
|
stream_a.enable()
|
71
75
|
puts stream_a.info
|
72
76
|
|
77
|
+
puts "禁用流 10 秒"
|
78
|
+
begin
|
79
|
+
puts("before disable: #{stream_a.info.to_json}")
|
80
|
+
stream_a.disable_till(Time.now.to_i + 10)
|
81
|
+
puts("after disable: #{stream_a.info.to_json}")
|
82
|
+
sleep(10)
|
83
|
+
puts("after 10 seconds: #{stream_a.info.to_json}")
|
84
|
+
rescue Pili::ResourceNotExist => e
|
85
|
+
puts e
|
86
|
+
end
|
87
|
+
|
73
88
|
puts "查询直播状态."
|
74
89
|
begin
|
75
90
|
status = stream_a.live_status()
|
76
|
-
puts
|
91
|
+
puts status
|
77
92
|
rescue Pili::ResourceNotExist => e
|
78
93
|
puts e
|
79
94
|
end
|
80
95
|
|
96
|
+
puts "更改流的实时转码规格"
|
97
|
+
begin
|
98
|
+
puts stream_a.info.to_json
|
99
|
+
stream_a.update_converts(["720p", "480p"])
|
100
|
+
puts stream_a.info.to_json
|
101
|
+
rescue => e
|
102
|
+
puts e
|
103
|
+
end
|
104
|
+
|
81
105
|
puts "查询推流历史."
|
82
106
|
activity = stream_a.history_activity()
|
83
107
|
puts activity
|
84
108
|
|
85
109
|
puts "保存直播数据."
|
86
110
|
begin
|
87
|
-
fname = stream_a.
|
88
|
-
puts fname
|
111
|
+
fname, persistentID = stream_a.saveas(:format => "mp4")
|
112
|
+
puts fname, persistentID
|
113
|
+
rescue => e
|
114
|
+
puts e
|
115
|
+
end
|
116
|
+
|
117
|
+
puts "保存直播截图."
|
118
|
+
begin
|
119
|
+
fname = stream_a.snapshot()
|
120
|
+
puts(fname)
|
89
121
|
rescue => e
|
90
122
|
puts e
|
91
123
|
end
|
92
124
|
|
93
125
|
puts "RTMP 推流地址."
|
94
|
-
url = Pili.rtmp_publish_url("publish-rtmp.test.com", hub_name,
|
126
|
+
url = Pili.rtmp_publish_url("publish-rtmp.test.com", hub_name, title_a, mac, 3600)
|
95
127
|
puts url
|
96
128
|
|
97
129
|
puts "RTMP 直播放址."
|
98
|
-
url = Pili.rtmp_play_url("live-rtmp.test.com", hub_name,
|
130
|
+
url = Pili.rtmp_play_url("live-rtmp.test.com", hub_name, title_a)
|
99
131
|
puts url
|
100
132
|
|
101
133
|
puts "HLS 直播地址."
|
102
|
-
url = Pili.hls_play_url("live-hls.test.com", hub_name,
|
134
|
+
url = Pili.hls_play_url("live-hls.test.com", hub_name, title_a)
|
103
135
|
puts url
|
104
136
|
|
105
137
|
puts "HDL 直播地址."
|
106
|
-
url = Pili.hdl_play_url("live-hdl.test.com", hub_name,
|
138
|
+
url = Pili.hdl_play_url("live-hdl.test.com", hub_name, title_a)
|
107
139
|
puts url
|
108
140
|
|
109
141
|
puts "截图直播地址"
|
110
|
-
url = Pili.snapshot_play_url("live-snapshot.test.com", hub_name,
|
142
|
+
url = Pili.snapshot_play_url("live-snapshot.test.com", hub_name, title_a)
|
111
143
|
puts url
|
data/lib/pili/client.rb
CHANGED
@@ -18,31 +18,31 @@ module Pili
|
|
18
18
|
class << self
|
19
19
|
# 生成 RTMP 推流地址.
|
20
20
|
# +expire_after_seconds+ 表示 URL 在多久之后失效.
|
21
|
-
def rtmp_publish_url(domain, hub,
|
21
|
+
def rtmp_publish_url(domain, hub, stream_title, mac, expire_after_seconds)
|
22
22
|
expire = Time.new.to_i + expire_after_seconds
|
23
|
-
path = "/#{hub}/#{
|
23
|
+
path = "/#{hub}/#{stream_title}?e=#{expire}"
|
24
24
|
token = mac.sign(path)
|
25
25
|
"rtmp://#{domain}#{path}&token=#{token}"
|
26
26
|
end
|
27
27
|
|
28
28
|
# 生成 RTMP 直播地址.
|
29
|
-
def rtmp_play_url(domain, hub,
|
30
|
-
"rtmp://#{domain}/#{hub}/#{
|
29
|
+
def rtmp_play_url(domain, hub, stream_title)
|
30
|
+
"rtmp://#{domain}/#{hub}/#{stream_title}"
|
31
31
|
end
|
32
32
|
|
33
33
|
# 生成 HLS 直播地址.
|
34
|
-
def hls_play_url(domain, hub,
|
35
|
-
"http://#{domain}/#{hub}/#{
|
34
|
+
def hls_play_url(domain, hub, stream_title)
|
35
|
+
"http://#{domain}/#{hub}/#{stream_title}.m3u8"
|
36
36
|
end
|
37
37
|
|
38
38
|
# 生成 HDL 直播地址.
|
39
|
-
def hdl_play_url(domain, hub,
|
40
|
-
"http://#{domain}/#{hub}/#{
|
39
|
+
def hdl_play_url(domain, hub, stream_title)
|
40
|
+
"http://#{domain}/#{hub}/#{stream_title}.flv"
|
41
41
|
end
|
42
42
|
|
43
43
|
# 生成截图直播地址.
|
44
|
-
def snapshot_play_url(domain, hub,
|
45
|
-
"http://#{domain}/#{hub}/#{
|
44
|
+
def snapshot_play_url(domain, hub, stream_title)
|
45
|
+
"http://#{domain}/#{hub}/#{stream_title}.jpg"
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
data/lib/pili/hub.rb
CHANGED
@@ -14,14 +14,14 @@ module Pili
|
|
14
14
|
# 创建一个流对象.
|
15
15
|
# 使用一个合法 rtmp_publish_url 发起推流就会自动创建流对象.
|
16
16
|
# 一般情况下不需要调用这个 API, 除非是想提前对这一个流做一些特殊配置.
|
17
|
-
def create(
|
18
|
-
@client.rpc.call_with_json("POST", "#{@base_url}/streams", {:key =>
|
19
|
-
Stream.new(@hub,
|
17
|
+
def create(stream_title)
|
18
|
+
@client.rpc.call_with_json("POST", "#{@base_url}/streams", {:key => stream_title})
|
19
|
+
Stream.new(@hub, stream_title, @client)
|
20
20
|
end
|
21
21
|
|
22
22
|
# 初始化一个流对象.
|
23
|
-
def stream(
|
24
|
-
Stream.new(@hub,
|
23
|
+
def stream(stream_title)
|
24
|
+
Stream.new(@hub, stream_title, @client)
|
25
25
|
end
|
26
26
|
|
27
27
|
def plist(opt = {})
|
@@ -47,8 +47,8 @@ module Pili
|
|
47
47
|
#
|
48
48
|
# marker = ""
|
49
49
|
# while true
|
50
|
-
#
|
51
|
-
# # do something with
|
50
|
+
# titles, marker = hub.list(:marker=> marker)
|
51
|
+
# # do something with titles.
|
52
52
|
# if marker == ""
|
53
53
|
# break
|
54
54
|
# end
|
@@ -70,8 +70,8 @@ module Pili
|
|
70
70
|
#
|
71
71
|
# marker = ""
|
72
72
|
# while true
|
73
|
-
#
|
74
|
-
# # do something with
|
73
|
+
# titles, marker = hub.list_live(:marker=> marker)
|
74
|
+
# # do something with titles.
|
75
75
|
# if marker == ""
|
76
76
|
# break
|
77
77
|
# end
|
@@ -80,6 +80,34 @@ module Pili
|
|
80
80
|
opt[:liveonly] = true
|
81
81
|
plist(opt)
|
82
82
|
end
|
83
|
+
|
84
|
+
# 批量查询直播实时信息
|
85
|
+
#
|
86
|
+
# 参数:
|
87
|
+
#
|
88
|
+
# stream_titles 字符串数组,其中元素是想要查询的流的标题。
|
89
|
+
#
|
90
|
+
# 返回:
|
91
|
+
#
|
92
|
+
# {
|
93
|
+
# "key" => <String>, # 流标题
|
94
|
+
# "startAt" => <Integer>, # 直播开始的 Unix 时间戳, 0 表示当前没在直播.
|
95
|
+
# "clientIp" => <String>, # 直播的客户端 IP.
|
96
|
+
# "bps" => <Integer>, # 直播的码率、帧率信息.
|
97
|
+
# "fps" => {
|
98
|
+
# "audio" => <Integer>,
|
99
|
+
# "video" => <Integer>,
|
100
|
+
# "data" => <Integer>
|
101
|
+
# }
|
102
|
+
# }
|
103
|
+
#
|
104
|
+
# 注意:
|
105
|
+
#
|
106
|
+
# 查询的流不存在或不在直播不会出现在返回结果里。
|
107
|
+
def batch_query_live_status(stream_titles)
|
108
|
+
ret = @client.rpc.call_with_json("POST", "#{@base_url}/livestreams", {:items=>stream_titles})
|
109
|
+
ret["items"]
|
110
|
+
end
|
83
111
|
|
84
112
|
def to_s
|
85
113
|
"#<#{self.class} #{@hub}>"
|
data/lib/pili/stream.rb
CHANGED
@@ -4,15 +4,19 @@ require "base64"
|
|
4
4
|
|
5
5
|
module Pili
|
6
6
|
class StreamInfo
|
7
|
-
attr_reader :hub, :
|
7
|
+
attr_reader :hub, :title
|
8
8
|
|
9
9
|
# 表示禁用结束的时间, 0 表示不禁用, -1 表示永久禁用.
|
10
10
|
attr_reader :disabled_till
|
11
|
+
|
12
|
+
# 流转码配置数组
|
13
|
+
attr_reader :converts
|
11
14
|
|
12
|
-
def initialize(hub,
|
15
|
+
def initialize(hub, title, disabled_till, converts)
|
13
16
|
@hub = hub
|
14
|
-
@
|
17
|
+
@title = title
|
15
18
|
@disabled_till = disabled_till
|
19
|
+
@converts = converts
|
16
20
|
end
|
17
21
|
|
18
22
|
def disabled?
|
@@ -20,22 +24,22 @@ module Pili
|
|
20
24
|
end
|
21
25
|
|
22
26
|
def to_s
|
23
|
-
"#<#{self.class} #{@hub}/#{@
|
27
|
+
"#<#{self.class} #{@hub}/#{@title} disabled:#{disabled?} converts:#{@converts}>"
|
24
28
|
end
|
25
29
|
|
26
30
|
def to_json
|
27
|
-
{:hub=>@hub, :key=>@
|
31
|
+
{:hub=>@hub, :key=>@title, :disabled=>disabled?, :converts=>@converts}.to_json
|
28
32
|
end
|
29
33
|
end
|
30
34
|
|
31
35
|
class Stream
|
32
|
-
attr_reader :hub, :
|
36
|
+
attr_reader :hub, :title
|
33
37
|
|
34
|
-
def initialize(hub,
|
38
|
+
def initialize(hub, title, client)
|
35
39
|
@hub = hub
|
36
|
-
@
|
40
|
+
@title = title
|
37
41
|
|
38
|
-
ekey = Base64.urlsafe_encode64(
|
42
|
+
ekey = Base64.urlsafe_encode64(title)
|
39
43
|
@base_url = "#{Config.api_base_url}/hubs/#{hub}/streams/#{ekey}"
|
40
44
|
|
41
45
|
@client = client
|
@@ -44,12 +48,19 @@ module Pili
|
|
44
48
|
# Info 获得流信息.
|
45
49
|
def info
|
46
50
|
ret = @client.rpc.call_with_json("GET", @base_url, nil)
|
47
|
-
StreamInfo.new @hub, @
|
51
|
+
StreamInfo.new @hub, @title, ret["disabledTill"], ret["converts"]
|
48
52
|
end
|
49
53
|
|
50
|
-
#
|
54
|
+
# 无限期禁用一个流.
|
51
55
|
def disable
|
52
|
-
|
56
|
+
disable_till(-1)
|
57
|
+
end
|
58
|
+
|
59
|
+
# 禁用一个流.
|
60
|
+
# 参数:
|
61
|
+
# timestamp 解除禁用的时间戳
|
62
|
+
def disable_till(timestamp)
|
63
|
+
@client.rpc.call_with_json("POST", "#{@base_url}/disabled", {:disabledTill=>timestamp})
|
53
64
|
end
|
54
65
|
|
55
66
|
# 启用一个流.
|
@@ -77,13 +88,45 @@ module Pili
|
|
77
88
|
|
78
89
|
# 保存直播回放.
|
79
90
|
#
|
80
|
-
#
|
81
|
-
#
|
82
|
-
#
|
83
|
-
|
91
|
+
# 参数:
|
92
|
+
# fname: 保存到存储空间的文件名,可选,不指定系统会随机生成
|
93
|
+
# start: 整数,可选,Unix 时间戳,要保存的直播的起始时间,不指定或 0 值表示从第一次直播开始
|
94
|
+
# end: 整数,可选,Unix 时间戳,要保存的直播的结束时间,不指定或 0 值表示当前时间
|
95
|
+
# format: 保存的文件格式,可选,默认为m3u8,如果指定其他格式,则保存动作为异步模式
|
96
|
+
# pipeline: 异步模式时,dora的私有队列,可选,不指定则使用公共队列
|
97
|
+
# notify: 异步模式时,保存成功回调通知地址,可选,不指定则不通知
|
98
|
+
# expireDays: 更改ts文件的过期时间,可选,默认为永久保存 -1表示不更改ts文件的生命周期,正值表示修改ts文件的生命周期为expireDays
|
99
|
+
#
|
100
|
+
# 返回:
|
101
|
+
# fname: 字符串,表示保存后在存储空间里的文件名。
|
102
|
+
# persistentID: 字符串,持久化异步处理任务ID,异步模式才会返回该字段,通常用不到该字段
|
103
|
+
def saveas(opt = {})
|
84
104
|
ret = @client.rpc.call_with_json("POST", "#{@base_url}/saveas", opt)
|
105
|
+
[ret["fname"], ret["persistentID"]]
|
106
|
+
end
|
107
|
+
|
108
|
+
# 保存直播截图
|
109
|
+
#
|
110
|
+
# 参数:
|
111
|
+
# fname 保存到存储空间的文件名,可选,不指定系统会随机生成。
|
112
|
+
# time 整数,可选,Unix 时间戳,要保存截图的时间点,不指定则为当前时间。
|
113
|
+
# format 保存的文件格式,可选,默认为jpg。
|
114
|
+
#
|
115
|
+
# 返回:
|
116
|
+
# fname => <String> # 字符串,表示保存后在存储空间里的文件名。
|
117
|
+
def snapshot(opt = {})
|
118
|
+
ret = @client.rpc.call_with_json("POST", "#{@base_url}/snapshot", opt)
|
85
119
|
ret["fname"]
|
86
120
|
end
|
121
|
+
|
122
|
+
# 修改流转码配置
|
123
|
+
#
|
124
|
+
# 参数:
|
125
|
+
# profiles 字符串数组,元素为转码的分辨率如:720p, 480p
|
126
|
+
#
|
127
|
+
def update_converts(profiles)
|
128
|
+
ret = @client.rpc.call_with_json("POST", "#{@base_url}/converts", :converts => profiles)
|
129
|
+
end
|
87
130
|
|
88
131
|
# 查询直播历史.
|
89
132
|
#
|
@@ -105,11 +148,11 @@ module Pili
|
|
105
148
|
end
|
106
149
|
|
107
150
|
def to_s
|
108
|
-
"#<#{self.class} #{@hub}/#{@
|
151
|
+
"#<#{self.class} #{@hub}/#{@title}>"
|
109
152
|
end
|
110
153
|
|
111
154
|
def to_json
|
112
|
-
{:hub=>@hub, :key=>@
|
155
|
+
{:hub=>@hub, :key=>@title}.to_json
|
113
156
|
end
|
114
157
|
end
|
115
158
|
end
|
data/lib/pili/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: piliv2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pili Engineer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-03-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -84,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
84
84
|
version: '0'
|
85
85
|
requirements: []
|
86
86
|
rubyforge_project:
|
87
|
-
rubygems_version: 2.
|
87
|
+
rubygems_version: 2.6.8
|
88
88
|
signing_key:
|
89
89
|
specification_version: 4
|
90
90
|
summary: Pili Streaming Cloud Server-Side Library For Ruby.
|