sleeproom 0.4.0 → 0.9.0.beta3

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: a8b882f789e21adccfa42fdb69e4c103b6397421b7ba688f2f2465d3ba874be1
4
- data.tar.gz: 51436fb96ee7f78de6e8e38541a260a5361bd4add38f0896f216728fa6ed3b03
3
+ metadata.gz: 3845e3c4fe71e788a6a58fdccdeafdf54df9a076970e603d255221f9a9eb485d
4
+ data.tar.gz: 5bb98e697e5b39f8d2a7c77e8b383dfcc68c76d342f9aa9a062cdb1908567bc4
5
5
  SHA512:
6
- metadata.gz: c697893e07f46d16341ed3a6008c9b4fe304f7b76c3c8c3c6105a3c3c136d46daeade8530696eed0fe806989bca7e60acac10edb4eeb0e2fcf6e5ad312c60c6f
7
- data.tar.gz: 0f5f7ae15517f8281ce44e3d8c0536b235436cf44fcfd9833c3f61b60a0cf82dd128788812a7185f4de82c8e3592fb5d11ca65edef58dc8b33b0fe4474e72ee6
6
+ metadata.gz: 10225f5c2f860a9c0862962f0e0e35ed8bd3ceb4d630d7cfc72dd98d388643dea785bab30448b2003c1019dbc3bcb708615ce63cd296fbff549c2d7c2a76d5d6
7
+ data.tar.gz: 638388a6ab62c5db454155bdf8d21aebd6f1fdd562ea0b807add10c4759008ab2f09e96f535990ca506ffa5ccfdbcccdde7509ef22434b94d660ee0d584322cd
data/.gitignore CHANGED
@@ -11,5 +11,7 @@
11
11
  # rspec failure tracking
12
12
  .rspec_status
13
13
 
14
+ Gemfile.lock
15
+
14
16
  # config
15
17
  /config/base.yml
data/Gemfile CHANGED
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source "https://rubygems.org"
2
4
 
3
5
  # Specify your gem's dependencies in sleeproom.gemspec
4
6
  gemspec
5
7
 
6
- gem "rake", "~> 12.0"
8
+ gem "rake", "~> 13.0"
7
9
  gem "rspec", "~> 3.0"
8
- gem "rubocop", "~> 0.79.0"
9
10
  gem "rubocop-github"
10
11
  gem "rubocop-performance", require: false
data/README.md CHANGED
@@ -16,7 +16,6 @@
16
16
  ## TODO
17
17
  * [ ] 代理支持
18
18
  * [ ] Web GUI
19
- * [ ] 日志保存
20
19
 
21
20
  ## Service example
22
21
  ```
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bundler/gem_tasks"
2
4
  require "rspec/core/rake_task"
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
- task :default => :spec
8
+ task default: :spec
data/bin/sleeproom CHANGED
@@ -3,5 +3,4 @@
3
3
 
4
4
  require "sleeproom/cli"
5
5
 
6
- cli = SleepRoom::CLI.new(ARGV)
7
- cli.run
6
+ SleepRoom::CLI.new(ARGV)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "async/websocket/connection"
2
4
  class WebSocketConnection < Async::WebSocket::Connection
3
5
  def read
@@ -5,16 +7,16 @@ class WebSocketConnection < Async::WebSocket::Connection
5
7
  parse(buffer)
6
8
  end
7
9
  end
8
-
10
+
9
11
  def write(object)
10
12
  super(dump(object))
11
13
  end
12
-
14
+
13
15
  def parse(buffer)
14
- return buffer
16
+ buffer
15
17
  end
16
-
18
+
17
19
  def dump(object)
18
- return object
20
+ object
19
21
  end
20
- end
22
+ end
data/lib/sleeproom/cli.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "ruby-next"
3
4
  require "optparse"
4
5
  require "yaml"
5
6
  require "sleeproom/record"
@@ -8,17 +9,25 @@ module SleepRoom
8
9
  class CLI
9
10
  # @param argv [Array]
10
11
  def initialize(argv)
12
+ SleepRoom.reload_config
11
13
  @options = {}
14
+ begin
15
+ minyami = `minyami --version`
16
+ status = $?
17
+ rescue => e
18
+ SleepRoom.warning("无法调用 Minyami: #{e.message}")
19
+ end
12
20
  build
13
- unless argv.empty?
21
+ if argv.empty? == false
14
22
  @parser.parse!(argv)
15
23
  action = argv.shift
16
- if action == "status"
24
+ case action
25
+ when "status"
17
26
  SleepRoom::Record::Tasks.status
18
- elsif action == "start"
19
- SleepRoom::Record::Tasks.start
20
- elsif action == "exit"
21
- SleepRoom::Record::Tasks.stop
27
+ when "start"
28
+ SleepRoom::Record::Tasks.start(**@options)
29
+ when "lists"
30
+ SleepRoom::Record::Tasks.lists
22
31
  end
23
32
  exit(0)
24
33
  else
@@ -27,46 +36,49 @@ module SleepRoom
27
36
  end
28
37
  end
29
38
 
30
- # @return [void]
31
- def run
32
- SleepRoom::Record::Tasks.start
33
- end
34
-
35
39
  # @return [void]
36
40
  def build
37
41
  @parser = OptionParser.new do |opt|
38
42
  opt.version = "SleepRoom / #{SleepRoom::VERSION}"
39
- opt.banner = "#{opt.version}"
43
+ opt.banner = opt.version.to_s
40
44
  opt.banner += "\nUsage: sleeproom [Options]\n\n"
41
45
 
42
46
  opt.banner += "Action:\n"
43
47
  opt.banner += "status".rjust(10)
44
48
  opt.banner += "显示任务状态".rjust(33)
45
49
  opt.banner += "\n"
50
+ opt.banner += "lists".rjust(9)
51
+ opt.banner += "显示录制列表".rjust(34)
52
+ opt.banner += "\n"
46
53
  opt.banner += "exit".rjust(8)
47
54
  opt.banner += "关闭任务队列".rjust(35)
48
55
  opt.banner += "\n\nCommands:\n"
49
56
 
50
- opt.on("-a ROOM, NAME", "--add ROOM, GROUP", Array, "添加到监视列表") do |room|
57
+ opt.on("-a ROOM, NAME", "--add ROOM, GROUP", Array, "添加房间到监视列表") do |room|
51
58
  SleepRoom::Record::Tasks.add(room[0].to_s, room[1].to_s)
52
59
  end
53
60
 
54
- opt.on("-r", "--remove [ROOM]", "从监视列表移除") do |room|
61
+ opt.on("-r", "--remove [ROOM]", "从监视列表移除房间") do |room|
55
62
  SleepRoom::Record::Tasks.remove(room)
56
63
  end
57
64
 
58
65
  opt.on("-d", "--download [ROOM]", "录制指定房间") do |room|
59
- raise Error.new("房间名不能为空") if room.nil?
66
+ raise Error, "房间名不能为空" if room.nil?
67
+
68
+ room = room.match(%r{https://www.showroom-live.com/(.*)})[1] if room.match?("https://www.showroom-live.com/")
60
69
  write_status = SleepRoom::Record::WriteStatus.new
61
- record = SleepRoom::Record::Showroom.new(room: room, group: "download", queue: write_status)
62
- record.record
70
+ Async do
71
+ record = SleepRoom::Record::Showroom.new(room: room, group: "download", queue: write_status)
72
+ record.record
73
+ end
63
74
  end
64
75
 
65
- opt.on("-v", "--verbose", "Print log") do
76
+ opt.on("--verbose", "DEBUG") do
77
+ ENV["SR_DEBUG"] = "DEBUG"
66
78
  @options[:verbose] = true
67
79
  end
68
-
69
- opt.on_tail("--version", "Print version") do
80
+
81
+ opt.on_tail("-v", "--version", "Print version") do
70
82
  STDOUT.puts(opt.version)
71
83
  end
72
84
 
@@ -8,39 +8,41 @@ require "sleeproom/record/record"
8
8
  require "sleeproom/record/tasks"
9
9
  require "sleeproom/record/websocket"
10
10
  require "sleeproom/record/api/api"
11
+ require "sleeproom/record/plugins"
11
12
  require "async"
12
13
  require "shellwords"
13
14
  module SleepRoom
14
15
  module Record
15
16
  # Okite!!!
16
17
  # @param url [String]
17
- # @return [Boolean]
18
- def self.call_minyami(url:, is_live: true, threads: configatron.minyami.threads, output:, retries: configatron.minyami.retries)
18
+ # @return [Integer]
19
+ def self.call_minyami(url:, is_live: true, threads: configatron.minyami.threads, output:, retries: configatron.minyami.retries, no_merge: configatron.minyami.no_merge)
19
20
  command = "minyami -d #{Shellwords.escape(url)}"
20
21
  command += " --retries #{retries.to_i}" if retries
21
22
  command += " --threads #{threads.to_i}" if threads
22
23
  command += " --live" if is_live
24
+ command += " --nomerge" if no_merge
23
25
  output = File.join(configatron.save_path, output)
24
26
  command += " --output #{Shellwords.escape(output)}" if output
25
27
  download_dir_check(output)
26
28
  pid = exec_command(command, output)
27
- return pid
29
+ pid
28
30
  end
29
31
 
30
32
  # @param command [String]
31
- # @return [Boolean]
33
+ # @return [Integer]
32
34
  def self.exec_command(command, output)
33
35
  SleepRoom.info("Call command: #{command}")
34
36
  SleepRoom.info("STDOUT: #{output}.out , STDERR: #{output}.err")
35
37
  pid = spawn(command, out: "#{output}.out", err: "#{output}.err")
36
38
  SleepRoom.info("PID: #{pid}")
37
39
  Process.detach(pid)
38
- return pid
40
+ pid
39
41
  end
40
42
 
41
43
  def self.download_dir_check(output)
42
44
  dir = File.dirname(output)
43
- if !Dir.exist?(dir)
45
+ unless Dir.exist?(dir)
44
46
  SleepRoom.info("#{dir} does not exist, creating...")
45
47
  SleepRoom.mkdir(dir)
46
48
  end
@@ -11,15 +11,11 @@ module SleepRoom
11
11
  module API
12
12
  class Error < StandardError; end
13
13
  class NotFoundError < Error; end
14
- ROOM_URL = "https://www.showroom-live.com"
15
- ROOM_API = "https://www.showroom-live.com/api/room/status"
16
- STREAMING_API = "https://www.showroom-live.com/api/live/streaming_url"
17
-
18
14
  USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
19
15
 
20
- def self.get(url)
21
- Async do
22
- http = Faraday.get(url, nil, {"User-Agent": USER_AGENT})
16
+ def self.get(url, task: Async::Task.current)
17
+ task.async do
18
+ http = Faraday.get(url, nil, { "User-Agent": USER_AGENT })
23
19
  if http.status == 200
24
20
  @json = JSON.parse(http.body)
25
21
  elsif http.status == 404
@@ -4,11 +4,12 @@ module SleepRoom
4
4
  module Record
5
5
  module API
6
6
  class Room
7
+ ROOM_URL = "https://www.showroom-live.com"
7
8
  def initialize(room_name)
8
9
  @url = ROOM_URL + "/" + room_name
9
10
  end
10
11
 
11
- def get(task: Async::Task.current)
12
+ def get
12
13
  @json = API.get(@url).wait
13
14
  end
14
15
  end
@@ -4,13 +4,14 @@ module SleepRoom
4
4
  module Record
5
5
  module API
6
6
  class RoomAPI
7
+ ROOM_API = "https://www.showroom-live.com/api/room/status"
7
8
  def initialize(room_url_key)
8
9
  @url = ROOM_API + "?room_url_key=" + room_url_key
9
10
  @json = nil
10
11
  get
11
12
  end
12
13
 
13
- def get(task: Async::Task.current)
14
+ def get
14
15
  @json = API.get(@url).wait
15
16
  end
16
17
 
@@ -4,21 +4,22 @@ module SleepRoom
4
4
  module Record
5
5
  module API
6
6
  class StreamingAPI
7
+ STREAMING_API = "https://www.showroom-live.com/api/live/streaming_url"
7
8
  def initialize(room_id)
8
9
  @url = STREAMING_API + "?room_id=" + room_id.to_s + "&ignore_low_stream=1"
9
10
  @json = nil
10
11
  get
11
12
  end
12
13
 
13
- def get(task: Async::Task.current)
14
+ def get
14
15
  @json = API.get(@url).wait
15
16
  end
16
17
 
17
18
  def streaming_url
18
19
  if @json["streaming_url_list"].nil?
19
- raise Error.new("streaming url is null.")
20
+ raise Error, "streaming url is null."
20
21
  else
21
- @json["streaming_url_list"].sort_by{|hash| -hash["quality"]}.first["url"]
22
+ @json["streaming_url_list"].min_by { |hash| -hash["quality"] }["url"]
22
23
  end
23
24
  end
24
25
  end
@@ -0,0 +1,9 @@
1
+ require 'dry/system/container'
2
+
3
+ module SleepRoom
4
+ module Record
5
+ class Plugins
6
+ extend Dry::Container::Mixin
7
+ end
8
+ end
9
+ end
@@ -0,0 +1 @@
1
+ # Youtube Uploader
@@ -1,148 +1,111 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "sleeproom/record/write_status"
3
4
 
4
5
  module SleepRoom
5
6
  module Record
7
+ # showroom-live.com
6
8
  class Showroom
7
- SITE = "showroom"
9
+ # Showroom Downloader
10
+ # @param room [String]
11
+ # @param group [String]
12
+ # @param queue [WriteStatus]
8
13
  def initialize(room:, group: "default", queue:)
9
14
  @room = room
10
15
  @group = group
11
- @queue = queue
16
+ @status = queue
12
17
  @running = false
13
- @downlaoding = false
14
- @reconnection = false
18
+ @downloading = false
19
+ set_room_info
15
20
  end
16
21
 
17
- # @param user [String]
18
- # @return [Boolean]
19
- def record(reconnection: false)
20
- room = @room
21
- Async do |task|
22
- set_room_info
23
- task.async do |t|
24
- while @is_live
25
- if status = SleepRoom.load_config(:status).find{|hash| hash[:room] == room}
26
- if !status[:pid].nil?
27
- break if SleepRoom.running?(status[:pid]) == false
28
- else
29
- break
30
- end
31
- else
32
- break
33
- end
34
- t.sleep 60
35
- end
36
- end.wait
37
- if @is_live
38
- start_time = Time.now
39
- log("Live broadcast.")
40
- streaming_url = parse_streaming_url
41
- output = build_output
42
- pid = SleepRoom::Record.call_minyami(url: streaming_url, output: output)
43
- downloading(streaming_url, pid, start_time)
44
- record
45
- else
46
- log("Status: Stop.")
47
- waiting_live(ws: :init)
48
- Async do |task|
49
- while true
50
- if @running == false && @reconnection == false
51
- start_websocket
52
- elsif @reconnection == true
53
- set_room_info
54
- start_websocket
55
- @reconnection = false
56
- end
57
- task.sleep 10
58
- end
59
- end
60
- end
61
- rescue => e
62
- add_error(e)
63
- SleepRoom.error(e.full_message)
64
- log("Retry...")
65
- task.sleep 5
66
- retry
22
+ # Record Room
23
+ def record
24
+ if @is_live
25
+ log("Status: broadcast.")
26
+ download_process if @downloading == false
27
+ else
28
+ update_status
29
+ log("Status: Stop.")
67
30
  end
31
+ start_websocket
32
+ rescue => e
33
+ error(e.full_message)
34
+ Async::Task.current.sleep 5
35
+ set_room_info
36
+ retry
68
37
  end
69
38
 
39
+ # Print log
40
+ # @param str [String]
70
41
  def log(str)
71
42
  SleepRoom.info("[#{@room}] #{str}")
72
43
  end
73
-
44
+
45
+ def debug(str)
46
+ SleepRoom.debug("[#{@room}] #{str}")
47
+ end
48
+
49
+ # Print log
50
+ # @param str [String]
51
+ def error(str)
52
+ SleepRoom.error("[#{@room}] #{str}")
53
+ end
54
+
74
55
  private
75
- def start_websocket()
76
- Async do |task|
77
- @running = true
78
- log("Broadcast Key: #{@broadcast_key}")
79
- waiting_live(ws: :init)
80
- ws = WebSocket.new(room: @room, broadcast_key: @broadcast_key, url: @broadcast_host)
81
- @ws = ws
82
- # ws status
83
- ws_task = task.async do |sub|
84
- ws.running = true
85
- ws.connect(task: sub) do |message|
86
- case message["t"].to_i
87
- when 101
88
- log("Live stop.")
89
- ws.running = false
90
- @running = false
91
- record
92
- when 104
93
- log("Live start.")
94
- start_time = Time.now
95
- streaming_url = parse_streaming_url
96
- output = build_output
97
- pid = SleepRoom::Record.call_minyami(url: streaming_url, output: output)
98
- downloading(streaming_url, pid, start_time)
99
- ws.running = false
100
- @running = false
101
- @reconnection = true
102
- else
103
- # other
104
- end
105
- end
106
- rescue => e
107
- SleepRoom.error("WS Stop.")
108
- SleepRoom.error(e.full_message)
109
- ws.running = false
110
- @running = false
111
- add_error(e)
112
- end
113
56
 
114
- Async do |task|
115
- last_ack = nil
116
- last_ping = nil
117
- while @running && @downlaoding == false
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
130
- ws.running = false
131
- @running = false
132
- task.stop
133
- end
134
- waiting_live({last_ack: last_ack})
135
- task.sleep 1
136
- end
57
+ def open_handler
58
+ end
59
+
60
+ def message_handler(data)
61
+ case data["t"].to_i
62
+ when 101
63
+ log("Live stop.")
64
+ @is_live = false
65
+ set_room_info
66
+ when 104
67
+ log("Live start.")
68
+ download_process
69
+ end
70
+ end
71
+
72
+ def close_handler(error)
73
+ @running = false
74
+ end
75
+
76
+ def error_handler(error)
77
+ @running = false
78
+ end
79
+
80
+ def ping_handler
81
+ end
82
+
83
+ # Websocket connect
84
+ def start_websocket(task: Async::Task.current)
85
+ connection = task.async do |task|
86
+ while @running == false
87
+ log("Broadcast Key: #{@broadcast_key}")
88
+ @ws = WebSocket.new(
89
+ room: @room,
90
+ broadcast_key: @broadcast_key,
91
+ url: @broadcast_host,
92
+ open_handler: method(:open_handler),
93
+ message_handler: method(:message_handler),
94
+ close_handler: method(:close_handler),
95
+ error_handler: method(:error_handler),
96
+ ping_handler: method(:ping_handler)
97
+ )
98
+ @ws.connect
137
99
  end
138
- task.children.each(&:wait)
139
- ensure
140
- ws.running = false
141
- @running = false
142
100
  end
101
+ task.children.each(&:wait)
102
+ ensure
103
+ log("Websocket task stop.")
104
+ connection&.stop
105
+ @running = false
143
106
  end
144
-
145
- def set_room_info
107
+
108
+ def set_room_info(task: Async::Task.current)
146
109
  api = API::RoomAPI.new(@room)
147
110
  @room_id = api.room_id
148
111
  @room_name = api.room_name
@@ -150,94 +113,103 @@ module SleepRoom
150
113
  @broadcast_host = api.broadcast_host
151
114
  @broadcast_key = api.broadcast_key
152
115
  rescue API::NotFoundError
153
- SleepRoom.error("[#{@room}] The room does not exist.")
116
+ error("The room does not exist.")
154
117
  log("Task stopped.")
155
- Async::Task.current.stop
118
+ task.stop
156
119
  rescue => e
157
- SleepRoom.error(e.message)
158
- log("[setRoomInfo] Retry...")
120
+ error(e.message)
121
+ log("Cannot parse room info.")
122
+ log("try again...")
123
+ task.sleep 5
159
124
  retry
160
125
  end
161
126
 
162
127
  def parse_streaming_url(task: Async::Task.current)
163
128
  api = API::StreamingAPI.new(@room_id)
164
- streaming_url_list = api.streaming_url
129
+ api.streaming_url
165
130
  rescue => e
166
131
  SleepRoom.error(e.full_message)
167
- log("[parseStreamingUrl] Retry...")
132
+ log("Unable to parse HLS url.")
133
+ task.sleep 1
168
134
  retry
169
135
  end
170
136
 
171
- def build_output(task: Async::Task.current)
172
- room = @room
173
- group = @group
174
- tmp_str = configatron.default_save_name
175
- tmp_str = tmp_str.sub("\%TIME\%", Time.now.strftime("%Y-%m-%d-%H-%M-%S")) if tmp_str.include?("\%TIME\%")
176
- tmp_str = tmp_str.sub("\%ROOMNAME\%", room) if tmp_str.include?("\%ROOMNAME\%")
177
- File.join(group, room, "showroom", tmp_str)
178
- end
179
-
180
- def downloading(streaming_url, pid, start_time, task: Async::Task.current)
181
- @downlaoding = true
182
- @queue.add({
183
- room: @room,
184
- start_time: start_time,
185
- name: @room_name,
186
- group: @group,
187
- live: true,
188
- status: :downloading,
189
- streaming_url: streaming_url,
190
- download_pid: pid
191
- })
137
+ # Downloader
138
+ def download_process(task: Async::Task.current)
139
+ completed = false
140
+ @downloading = true
141
+ log("Download start.")
142
+ streaming_url = parse_streaming_url
143
+ output = build_output
144
+ # Call time
145
+ call_time = Time.now
146
+ pid = SleepRoom::Record.call_minyami(url: streaming_url, output: output)
147
+ @status.downloading(room: @room, url: streaming_url, pid: pid, start_time: call_time, output: output)
148
+ log("Waiting for download process.")
149
+ # Status
192
150
  task.async do |t|
193
151
  loop do
194
- live = API::RoomAPI.new(@room).live?
195
- if !SleepRoom.running?(pid) && !live
196
- log("Download complete.")
197
- @downlaoding = false
198
- @queue.add({
199
- room: @room,
200
- name: @room_name,
201
- group: @group,
202
- live: API::RoomAPI.new(@room).live?,
203
- status: :complete,
204
- })
152
+ if SleepRoom.running?(pid) && @is_live
153
+ # Downloading
154
+ elsif SleepRoom.running?(pid) && @is_live == false
155
+ # Live stopped, Minyami process running.
156
+ retries = 0
157
+ while retries < 3
158
+ set_room_info
159
+ break if @is_live == true
160
+
161
+ log("Waiting for latest status...")
162
+ task.sleep 5
163
+ retries += 1
164
+ end
165
+ completed = true if retries == 3 && @is_live == false
166
+ elsif (SleepRoom.running?(pid) == false && @is_live == false) || completed
167
+ # Live stopped, Minyami process stopped.
168
+ @status.add(room: @room, status: :completed, live: false)
169
+ log("Download completed.")
170
+ if configatron.minyami.no_merge
171
+ log("Find minyami temp files...")
172
+ tmp_path = SleepRoom.find_tmp_directory(output, call_time)
173
+ if tmp_path
174
+ log("Temp files in #{tmp_path}.")
175
+ save_path = File.dirname("#{configatron.save_path}/#{output}")
176
+ dir_name = File.basename(output).sub(".ts", "")
177
+ SleepRoom.move_ts_to_archive(tmp_path, save_path, dir_name)
178
+ log("Save chunks to #{save_path}/#{dir_name}.")
179
+ else
180
+ log("Can not find temp file")
181
+ end
182
+ end
183
+ @ws.close
184
+ @running = false
205
185
  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.")
186
+ elsif SleepRoom.running?(pid) == false && @is_live == true
187
+ # Live broadcast, Minyami process stopped.
188
+ set_room_info
189
+ next if @is_live == false
190
+
191
+ log("Minyami stopped, Try to call Minyami again.")
192
+ download_process
213
193
  end
214
- t.sleep 120
215
- rescue Faraday::ConnectionFailed
216
- log("Network error.")
217
- retry
194
+ t.sleep 1
218
195
  end
219
- end.wait
220
- end
221
-
222
- def add_error(error)
223
- @queue.add({
224
- room: @room,
225
- name: @room_name,
226
- group: @group,
227
- status: :retry,
228
- error: error.message
229
- })
230
- end
231
-
232
- def waiting_live(status)
233
- @queue.add({
234
- room: @room,
235
- live: false,
236
- group: @group,
237
- name: @room_name,
238
- status: :waiting,
239
- ws: status
240
- })
196
+ end
197
+ ensure
198
+ @downloading = false
199
+ end
200
+
201
+ # @return [String]
202
+ def build_output
203
+ room = @room
204
+ group = @group
205
+ tmp_str = configatron.default_save_name
206
+ tmp_str = tmp_str.sub("\%TIME\%", Time.now.strftime("%Y-%m-%d-%H-%M-%S")) if tmp_str.include?("\%TIME\%")
207
+ tmp_str = tmp_str.sub("\%ROOMNAME\%", room) if tmp_str.include?("\%ROOMNAME\%")
208
+ File.join(group, room, tmp_str)
209
+ end
210
+
211
+ def update_status
212
+ @status.waiting(room: @room, group: @group, room_name: @room_name, key: @broadcast_key)
241
213
  end
242
214
  end
243
215
  end