sleeproom 0.1.2 → 0.4.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 602c623c73913b772f7b1375ce6a7d9c3415df23bcd564d78ae58ddb21fd7b7b
4
- data.tar.gz: 3b6859da62f1a29c1f8f05b65d039a593f78ba6e5e6b4fa9d9c9636d5f6c56ca
3
+ metadata.gz: 16490f0f3a48428466310c0a5ab4c89a7395aeeb9c71aaba2679b43894c145db
4
+ data.tar.gz: e03f35faf54bd848151501bbb0dd14c56ea935647fe7bc1e8b9f00095d665691
5
5
  SHA512:
6
- metadata.gz: 2af5ad3283bcaa58d7b6524a12413b81ef1aaf294d0d5bc95e5abfdae9892a876bb7a7cd32f6a8ad56154054afe3c3e61f5f0fe69bb445f37935fe1c80fbca5f
7
- data.tar.gz: 881a889d97e13a3a3c78c7a98a94563ddb1d2ecd338809ba313ae3748e4f10403dde1a6c8b48f70c0200c7426446a71da96671516be82f5bb9cd9940c94ab1a7
6
+ metadata.gz: 819b5780ed280aefcc693986715e30c014128da80d110fc8abb35a23992efdda1f3344ec9b343a1ce746b29a8bd89cf2f90d1beb3989abf9c3d333b8b8f03d5c
7
+ data.tar.gz: 90a9e5e52b573c39b8627521b04ac7811067a8a1c6f379d597f7c35fbdb7b94a345980feaf74ef4bd49df793d35f40d6135b9e3984633937517d045d6b32140c
@@ -1,13 +1,13 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sleeproom (0.1.2)
5
- async
6
- async-http-faraday
7
- async-websocket
8
- colorize
9
- configatron
10
- terminal-table
4
+ sleeproom (0.4.3)
5
+ async (~> 1.26.0)
6
+ async-http-faraday (~> 0.9.0)
7
+ async-websocket (~> 0.15.0)
8
+ colorize (~> 0.8.0)
9
+ configatron (~> 4.5.0)
10
+ terminal-table (~> 1.8.0)
11
11
 
12
12
  GEM
13
13
  remote: https://rubygems.org/
@@ -1,6 +1,7 @@
1
+ #!/usr/bin/env ruby
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require "sleeproom/cli"
4
5
 
5
6
  cli = SleepRoom::CLI.new(ARGV)
6
- cli.run
7
+ cli.run
@@ -8,6 +8,7 @@ module SleepRoom
8
8
  class CLI
9
9
  # @param argv [Array]
10
10
  def initialize(argv)
11
+ SleepRoom.reload_config
11
12
  @options = {}
12
13
  build
13
14
  unless argv.empty?
@@ -17,8 +18,6 @@ module SleepRoom
17
18
  SleepRoom::Record::Tasks.status
18
19
  elsif action == "start"
19
20
  SleepRoom::Record::Tasks.start
20
- elsif action == "download"
21
- raise "未实现"
22
21
  elsif action == "exit"
23
22
  SleepRoom::Record::Tasks.stop
24
23
  end
@@ -53,18 +52,24 @@ module SleepRoom
53
52
  SleepRoom::Record::Tasks.add(room[0].to_s, room[1].to_s)
54
53
  end
55
54
 
56
- opt.on("-r", "--remove [URL]", "从监视列表移除") do |room|
55
+ opt.on("-r", "--remove [ROOM]", "从监视列表移除") do |room|
57
56
  SleepRoom::Record::Tasks.remove(room)
58
57
  end
59
58
 
60
- opt.on("-v", "--verbose", "Print log") do
61
- @options[:verbose] = true
59
+ opt.on("-d", "--download [ROOM]", "录制指定房间") do |room|
60
+ raise Error.new("房间名不能为空") if room.nil?
61
+ if room.match?("https://www.showroom-live.com/")
62
+ room = room.match(/https:\/\/www.showroom-live.com\/(.*)/)[1]
63
+ end
64
+ write_status = SleepRoom::Record::WriteStatus.new
65
+ record = SleepRoom::Record::Showroom.new(room: room, group: "download", queue: write_status)
66
+ record.record
62
67
  end
63
68
 
64
- opt.on("-d", "daemon", "Daemonize the script into the background") do
65
- @options[:daemon] = true
69
+ opt.on("-v", "--verbose", "Print log") do
70
+ @options[:verbose] = true
66
71
  end
67
-
72
+
68
73
  opt.on_tail("--version", "Print version") do
69
74
  STDOUT.puts(opt.version)
70
75
  end
@@ -10,6 +10,7 @@ module SleepRoom
10
10
  module Record
11
11
  module API
12
12
  class Error < StandardError; end
13
+ class NotFoundError < Error; end
13
14
  ROOM_URL = "https://www.showroom-live.com"
14
15
  ROOM_API = "https://www.showroom-live.com/api/room/status"
15
16
  STREAMING_API = "https://www.showroom-live.com/api/live/streaming_url"
@@ -21,6 +22,8 @@ module SleepRoom
21
22
  http = Faraday.get(url, nil, {"User-Agent": USER_AGENT})
22
23
  if http.status == 200
23
24
  @json = JSON.parse(http.body)
25
+ elsif http.status == 404
26
+ raise NotFoundError
24
27
  else
25
28
  raise Error, "HTTP Error: #{http.status}"
26
29
  end
@@ -15,7 +15,11 @@ module SleepRoom
15
15
  end
16
16
 
17
17
  def streaming_url
18
- @json["streaming_url_list"].sort_by{|hash| -hash["quality"]}.first["url"]
18
+ if @json["streaming_url_list"].nil?
19
+ raise Error.new("streaming url is null.")
20
+ else
21
+ @json["streaming_url_list"].sort_by{|hash| -hash["quality"]}.first["url"]
22
+ end
19
23
  end
20
24
  end
21
25
  end
@@ -112,15 +112,27 @@ module SleepRoom
112
112
  end
113
113
 
114
114
  Async do |task|
115
+ last_ack = nil
116
+ last_ping = nil
115
117
  while @running && @downlaoding == false
116
- status = ws.status
117
- if !status[:last_ack].nil? && Time.now.to_i - status[:last_ack].to_i > 65
118
+ queue = ws.queue.items
119
+ if !queue.empty?
120
+ queue.each do |event|
121
+ case event[:event]
122
+ when :ack
123
+ last_ack = event[:time]
124
+ when :ping
125
+ last_ping = event[:ping]
126
+ end
127
+ end
128
+ end
129
+ if !last_ack.nil? && Time.now.to_i - last_ack.to_i > 65
118
130
  ws.running = false
119
131
  @running = false
120
132
  task.stop
121
133
  end
122
- waiting_live(status)
123
- task.sleep 30
134
+ waiting_live({last_ack: last_ack})
135
+ task.sleep 1
124
136
  end
125
137
  end
126
138
  task.children.each(&:wait)
@@ -131,17 +143,29 @@ module SleepRoom
131
143
  end
132
144
 
133
145
  def set_room_info
134
- api = API::RoomAPI.new(room)
146
+ api = API::RoomAPI.new(@room)
135
147
  @room_id = api.room_id
136
148
  @room_name = api.room_name
137
149
  @is_live = api.live?
138
150
  @broadcast_host = api.broadcast_host
139
151
  @broadcast_key = api.broadcast_key
152
+ rescue API::NotFoundError
153
+ SleepRoom.error("[#{@room}] The room does not exist.")
154
+ log("Task stopped.")
155
+ Async::Task.current.stop
156
+ rescue => e
157
+ SleepRoom.error(e.message)
158
+ log("[setRoomInfo] Retry...")
159
+ retry
140
160
  end
141
161
 
142
162
  def parse_streaming_url(task: Async::Task.current)
143
163
  api = API::StreamingAPI.new(@room_id)
144
164
  streaming_url_list = api.streaming_url
165
+ rescue => e
166
+ SleepRoom.error(e.full_message)
167
+ log("[parseStreamingUrl] Retry...")
168
+ retry
145
169
  end
146
170
 
147
171
  def build_output(task: Async::Task.current)
@@ -166,8 +190,9 @@ module SleepRoom
166
190
  download_pid: pid
167
191
  })
168
192
  task.async do |t|
169
- while true
170
- if !SleepRoom.running?(pid) && !API::RoomAPI.new(@room).live?
193
+ loop do
194
+ live = API::RoomAPI.new(@room).live?
195
+ if !SleepRoom.running?(pid) && !live
171
196
  log("Download complete.")
172
197
  @downlaoding = false
173
198
  @queue.add({
@@ -178,8 +203,18 @@ module SleepRoom
178
203
  status: :complete,
179
204
  })
180
205
  break
206
+ elsif live && !SleepRoom.running?(pid)
207
+ log("Minyami crash.")
208
+ streaming_url = parse_streaming_url
209
+ output = build_output
210
+ pid = SleepRoom::Record.call_minyami(url: streaming_url, output: output)
211
+ elsif !live && SleepRoom.running?(pid)
212
+ log("Live stop.")
181
213
  end
182
- t.sleep 60
214
+ t.sleep 120
215
+ rescue Faraday::ConnectionFailed
216
+ log("Network error.")
217
+ retry
183
218
  end
184
219
  end.wait
185
220
  end
@@ -6,12 +6,13 @@ require "json"
6
6
  module SleepRoom
7
7
  module Record
8
8
  class WebSocket
9
+ attr_accessor :queue
9
10
  def initialize(room:, broadcast_key:, url:)
10
11
  @room = room
11
12
  @url = "wss://" + url
12
13
  @broadcast_key = broadcast_key
13
14
  @running = false
14
- @status = {}
15
+ @queue = Async::Queue.new
15
16
  end
16
17
 
17
18
  def connect(task: Async::Task.current)
@@ -23,12 +24,12 @@ module SleepRoom
23
24
  connection.write("SUB\t#{@broadcast_key}")
24
25
  connection.flush
25
26
  log("Connect to websocket server.")
26
- @status[:last_update] = Time.now
27
+ @queue.enqueue({event: :connect, time: Time.now})
27
28
 
28
29
  ping_task = task.async do |sub|
29
30
  while @running
30
31
  sub.sleep 60
31
- @status[:last_ping] = Time.now
32
+ @queue.enqueue({event: :ping, time: Time.now})
32
33
  connection.write("PING\tshowroom")
33
34
  connection.flush
34
35
  end
@@ -44,12 +45,10 @@ module SleepRoom
44
45
  end
45
46
 
46
47
  while message = connection.read
47
- @status[:last_update]
48
48
  if message == "ACK\tshowroom"
49
- @status[:last_ack] = Time.now if message == "ACK\tshowroom"
49
+ @queue.enqueue({event: :ack, time: Time.now}) if message == "ACK\tshowroom"
50
50
  end
51
51
  if message.start_with?("MSG")
52
- @status[:last_msg] = Time.now
53
52
  begin
54
53
  yield JSON.parse(message.split("\t")[2])
55
54
  rescue => e
@@ -79,10 +78,6 @@ module SleepRoom
79
78
  @connection.close
80
79
  end
81
80
 
82
- def status
83
- @status
84
- end
85
-
86
81
  def log(str)
87
82
  SleepRoom.info("[#{@room}] #{str}")
88
83
  end
@@ -4,6 +4,7 @@ require "configatron"
4
4
  require "colorize"
5
5
  require "fileutils"
6
6
  require "yaml"
7
+ require "logger"
7
8
 
8
9
  module SleepRoom
9
10
  class Error < StandardError; end
@@ -109,12 +110,8 @@ module SleepRoom
109
110
  logger: {
110
111
  console: true,
111
112
  file: {
112
- use: true,
113
+ use: false,
113
114
  path: "#{sleeproom_dir}/log"
114
- },
115
- websocket: {
116
- log: true,
117
- ping_log: false
118
115
  }
119
116
  }
120
117
  }
@@ -145,7 +142,8 @@ module SleepRoom
145
142
  end
146
143
  true
147
144
  rescue Errno::ENOENT => e
148
- error("Could not load file. \n#{e.message}")
145
+ info("Creating configuration...")
146
+ init_base
149
147
  false
150
148
  end
151
149
 
@@ -168,7 +166,7 @@ module SleepRoom
168
166
 
169
167
  def self.running?(pid=nil)
170
168
  pid = SleepRoom.load_config(:pid) if pid.nil?
171
- Process.getpgid(pid)
169
+ Process.kill(0, pid)
172
170
  true
173
171
  rescue
174
172
  false
@@ -197,18 +195,46 @@ module SleepRoom
197
195
  # @param string [String]
198
196
  # @return [nil]
199
197
  def self.info(string)
200
- STDOUT.puts("[INFO] #{string}".colorize(:white))
198
+ log(:info, string)
201
199
  end
202
200
 
203
201
  # @param string [String]
204
202
  # @return [nil]
205
203
  def self.warning(string)
206
- warn("[WARN] #{string}".colorize(:yellow))
204
+ log(:warning, string)
207
205
  end
208
206
 
209
207
  # @param string [String]
210
208
  # @return [nil]
211
209
  def self.error(string)
212
- STDOUT.puts("[ERROR] #{string}".colorize(:red))
210
+ log(:error, string)
211
+ end
212
+
213
+ def self.log(type, log)
214
+ if configatron.logger.console == true
215
+ case type
216
+ when :info
217
+ puts("[INFO] #{log}".colorize(:white))
218
+ when :warning
219
+ warn("[WARN] #{log}".colorize(:yellow))
220
+ when :error
221
+ puts("[ERROR] #{log}".colorize(:red))
222
+ end
223
+ end
224
+ file_logger(type, log) if configatron.logger.file.use == true
225
+ end
226
+
227
+ def self.file_logger(type, log)
228
+ path = configatron.logger.file.path
229
+ mkdir(File.dirname(path)) unless Dir.exist?(File.dirname(path))
230
+ logger = Logger.new(path)
231
+ case type
232
+ when :info
233
+ logger.info(log)
234
+ when :warning
235
+ logger.warning(log)
236
+ when :error
237
+ logger.error(log)
238
+ end
213
239
  end
214
240
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SleepRoom
4
- VERSION = "0.1.2"
4
+ VERSION = "0.4.3"
5
5
  end
@@ -25,12 +25,12 @@ Gem::Specification.new do |spec|
25
25
  spec.executables = ["sleeproom"]
26
26
  spec.require_paths = ["lib"]
27
27
 
28
- spec.add_runtime_dependency("colorize")
29
- spec.add_runtime_dependency("async")
30
- spec.add_runtime_dependency("async-websocket")
31
- spec.add_runtime_dependency("configatron")
32
- spec.add_runtime_dependency("async-http-faraday")
33
- spec.add_runtime_dependency("terminal-table")
28
+ spec.add_runtime_dependency("colorize", "~> 0.8.0")
29
+ spec.add_runtime_dependency("async", "~> 1.26.0")
30
+ spec.add_runtime_dependency("async-websocket", "~> 0.15.0")
31
+ spec.add_runtime_dependency("configatron", "~> 4.5.0")
32
+ spec.add_runtime_dependency("async-http-faraday", "~> 0.9.0")
33
+ spec.add_runtime_dependency("terminal-table", "~> 1.8.0")
34
34
 
35
35
  spec.post_install_message = <<~STR
36
36
  SleepRoom 需要:
metadata CHANGED
@@ -1,99 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sleeproom
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Koell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-11 00:00:00.000000000 Z
11
+ date: 2020-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 0.8.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 0.8.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: async
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 1.26.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 1.26.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: async-websocket
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: 0.15.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: 0.15.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: configatron
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: 4.5.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: 4.5.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: async-http-faraday
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: 0.9.0
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: 0.9.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: terminal-table
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: 1.8.0
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: 1.8.0
97
97
  description:
98
98
  email:
99
99
  - i@wug.moe