sleeproom 0.9.0.beta1 → 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: c475d0ffb218cfa389559edacf780caa9e82b2bdeaf4091abb775536b3036308
4
- data.tar.gz: 107b04198f32b68c03417f9625e6019f080e65fe0bb0a280ad600f6ebd0eba51
3
+ metadata.gz: 3845e3c4fe71e788a6a58fdccdeafdf54df9a076970e603d255221f9a9eb485d
4
+ data.tar.gz: 5bb98e697e5b39f8d2a7c77e8b383dfcc68c76d342f9aa9a062cdb1908567bc4
5
5
  SHA512:
6
- metadata.gz: ad6ad5b056aa8b5575f41d93dfb0647d1797bc54d3214581f757bd0bdb0c05950b81fdd20938d4101c8612a1800f926d2de4eb2e777b578d225163d90313161a
7
- data.tar.gz: bfc3096527de19b9d21e9f6ede44d2cf9818163c9f4dd0fa3a6d316ef36ba7a26ebcb3eca4a5c92b5266e3ab21084e616525e55c7a1495abf8d5c6e7c32aa979
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/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/lib/sleeproom/cli.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "backports/2.5" if RUBY_VERSION < "2.5.0"
4
3
  require "ruby-next"
5
4
  require "optparse"
6
5
  require "yaml"
@@ -12,6 +11,12 @@ module SleepRoom
12
11
  def initialize(argv)
13
12
  SleepRoom.reload_config
14
13
  @options = {}
14
+ begin
15
+ minyami = `minyami --version`
16
+ status = $?
17
+ rescue => e
18
+ SleepRoom.warning("无法调用 Minyami: #{e.message}")
19
+ end
15
20
  build
16
21
  if argv.empty? == false
17
22
  @parser.parse!(argv)
@@ -42,18 +47,18 @@ module SleepRoom
42
47
  opt.banner += "status".rjust(10)
43
48
  opt.banner += "显示任务状态".rjust(33)
44
49
  opt.banner += "\n"
45
- opt.banner += "list".rjust(8)
46
- opt.banner += "显示录制列表".rjust(35)
50
+ opt.banner += "lists".rjust(9)
51
+ opt.banner += "显示录制列表".rjust(34)
47
52
  opt.banner += "\n"
48
53
  opt.banner += "exit".rjust(8)
49
54
  opt.banner += "关闭任务队列".rjust(35)
50
55
  opt.banner += "\n\nCommands:\n"
51
56
 
52
- opt.on("-a ROOM, NAME", "--add ROOM, GROUP", Array, "添加到监视列表") do |room|
57
+ opt.on("-a ROOM, NAME", "--add ROOM, GROUP", Array, "添加房间到监视列表") do |room|
53
58
  SleepRoom::Record::Tasks.add(room[0].to_s, room[1].to_s)
54
59
  end
55
60
 
56
- opt.on("-r", "--remove [ROOM]", "从监视列表移除") do |room|
61
+ opt.on("-r", "--remove [ROOM]", "从监视列表移除房间") do |room|
57
62
  SleepRoom::Record::Tasks.remove(room)
58
63
  end
59
64
 
@@ -68,11 +73,12 @@ module SleepRoom
68
73
  end
69
74
  end
70
75
 
71
- opt.on("-v", "--verbose", "Print log") do
76
+ opt.on("--verbose", "DEBUG") do
77
+ ENV["SR_DEBUG"] = "DEBUG"
72
78
  @options[:verbose] = true
73
79
  end
74
80
 
75
- opt.on_tail("--version", "Print version") do
81
+ opt.on_tail("-v", "--version", "Print version") do
76
82
  STDOUT.puts(opt.version)
77
83
  end
78
84
 
@@ -8,21 +8,20 @@ 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/web/app"
11
+ require "sleeproom/record/plugins"
12
12
  require "async"
13
- require "roda"
14
- require "rack/handler/falcon"
15
13
  require "shellwords"
16
14
  module SleepRoom
17
15
  module Record
18
16
  # Okite!!!
19
17
  # @param url [String]
20
18
  # @return [Integer]
21
- def self.call_minyami(url:, is_live: true, threads: configatron.minyami.threads, output:, retries: configatron.minyami.retries)
19
+ def self.call_minyami(url:, is_live: true, threads: configatron.minyami.threads, output:, retries: configatron.minyami.retries, no_merge: configatron.minyami.no_merge)
22
20
  command = "minyami -d #{Shellwords.escape(url)}"
23
21
  command += " --retries #{retries.to_i}" if retries
24
22
  command += " --threads #{threads.to_i}" if threads
25
23
  command += " --live" if is_live
24
+ command += " --nomerge" if no_merge
26
25
  output = File.join(configatron.save_path, output)
27
26
  command += " --output #{Shellwords.escape(output)}" if output
28
27
  download_dir_check(output)
@@ -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
@@ -16,21 +16,23 @@ module SleepRoom
16
16
  @status = queue
17
17
  @running = false
18
18
  @downloading = false
19
+ set_room_info
19
20
  end
20
21
 
21
22
  # Record Room
22
23
  def record
23
- set_room_info
24
24
  if @is_live
25
25
  log("Status: broadcast.")
26
26
  download_process if @downloading == false
27
27
  else
28
+ update_status
28
29
  log("Status: Stop.")
29
30
  end
30
31
  start_websocket
31
32
  rescue => e
32
33
  error(e.full_message)
33
34
  Async::Task.current.sleep 5
35
+ set_room_info
34
36
  retry
35
37
  end
36
38
 
@@ -40,6 +42,10 @@ module SleepRoom
40
42
  SleepRoom.info("[#{@room}] #{str}")
41
43
  end
42
44
 
45
+ def debug(str)
46
+ SleepRoom.debug("[#{@room}] #{str}")
47
+ end
48
+
43
49
  # Print log
44
50
  # @param str [String]
45
51
  def error(str)
@@ -48,52 +54,55 @@ module SleepRoom
48
54
 
49
55
  private
50
56
 
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
+
51
83
  # Websocket connect
52
84
  def start_websocket(task: Async::Task.current)
53
- main = task.async do |task|
54
- log("Broadcast Key: #{@broadcast_key}")
55
- ws = WebSocket.new(room: @room, broadcast_key: @broadcast_key, url: @broadcast_host)
56
- @running = true
57
- update_status
58
- begin
59
- ws.connect do |event, message|
60
- if event == :websocket
61
- case message["t"].to_i
62
- when 101
63
- log("Live stop.")
64
- @is_live = false
65
- ws.running = false
66
- when 104
67
- log("Live start.")
68
- download_process
69
- end
70
- elsif event == :status
71
- case message[:event]
72
- when :ack
73
- update_status
74
- when :close
75
- log("WebSocket Close.")
76
- task&.stop
77
- when :error
78
- error("Network Error.")
79
- task&.stop
80
- end
81
- else
82
- # TODO
83
- end
84
- end
85
- rescue => e
86
- error("WebSocket stopped.")
87
- puts(e.full_message)
88
- task&.stop
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
89
99
  end
90
100
  end
91
- main.wait
101
+ task.children.each(&:wait)
92
102
  ensure
103
+ log("Websocket task stop.")
104
+ connection&.stop
93
105
  @running = false
94
- task.sleep 5
95
- main&.stop
96
- start_websocket
97
106
  end
98
107
 
99
108
  def set_room_info(task: Async::Task.current)
@@ -109,18 +118,19 @@ module SleepRoom
109
118
  task.stop
110
119
  rescue => e
111
120
  error(e.message)
112
- log("获取房间信息失败.")
113
- log("等待5秒...")
121
+ log("Cannot parse room info.")
122
+ log("try again...")
114
123
  task.sleep 5
115
124
  retry
116
125
  end
117
126
 
118
- def parse_streaming_url
127
+ def parse_streaming_url(task: Async::Task.current)
119
128
  api = API::StreamingAPI.new(@room_id)
120
129
  api.streaming_url
121
130
  rescue => e
122
131
  SleepRoom.error(e.full_message)
123
- log("获取 HLS 地址失败.")
132
+ log("Unable to parse HLS url.")
133
+ task.sleep 1
124
134
  retry
125
135
  end
126
136
 
@@ -149,7 +159,7 @@ module SleepRoom
149
159
  break if @is_live == true
150
160
 
151
161
  log("Waiting for latest status...")
152
- task.sleep 20
162
+ task.sleep 5
153
163
  retries += 1
154
164
  end
155
165
  completed = true if retries == 3 && @is_live == false
@@ -157,18 +167,20 @@ module SleepRoom
157
167
  # Live stopped, Minyami process stopped.
158
168
  @status.add(room: @room, status: :completed, live: false)
159
169
  log("Download completed.")
160
- log("Find minyami temp files...")
161
- tmp_path = SleepRoom.find_tmp_directory(output, call_time)
162
- if tmp_path
163
- log("Temp files in #{tmp_path}.")
164
- save_path = File.dirname("#{configatron.save_path}/#{output}")
165
- dir_name = File.basename(output).sub(".ts", "")
166
- SleepRoom.move_ts_to_archive(tmp_path, save_path, dir_name)
167
- log("Save chunks to #{save_path}/#{dir_name}.")
168
- else
169
- log("Can not find temp file")
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
170
182
  end
171
- record
183
+ @ws.close
172
184
  @running = false
173
185
  break
174
186
  elsif SleepRoom.running?(pid) == false && @is_live == true
@@ -35,14 +35,6 @@ module SleepRoom
35
35
  end
36
36
  end
37
37
  SleepRoom.info("共启动 #{running_task_count} 个任务.")
38
- if configatron.web.use
39
- Async do
40
- host = configatron.web.server.to_s
41
- port = configatron.web.port.to_i
42
- Rack::Handler.get(:falcon).run(Web::App, Host: host, Port: port)
43
- SleepRoom.info("Web server running. http://#{host}:#{port}/")
44
- end
45
- end
46
38
  task.children.each(&:wait)
47
39
  rescue StandardError => e
48
40
  puts e.full_message
@@ -105,7 +97,13 @@ module SleepRoom
105
97
 
106
98
  def self.add(room, group)
107
99
  Async do
108
- group = "default" if group.empty?
100
+ if group.empty?
101
+ if group_match = room.match(/(?<=[((]).*?(?=[))])/)
102
+ group = group_match[0]
103
+ else
104
+ group = "default"
105
+ end
106
+ end
109
107
  old_record = SleepRoom.load_config(:record)
110
108
  name = API::RoomAPI.new(room).room_name
111
109
  input_record = { "room" => room, "name" => name }
@@ -8,103 +8,85 @@ require "json"
8
8
  module SleepRoom
9
9
  module Record
10
10
  class WebSocket
11
- attr_accessor :last_ack
12
- def initialize(room:, broadcast_key:, url:)
11
+ def initialize(room:, broadcast_key:, url:, open_handler:, message_handler:, close_handler:, error_handler:, ping_handler:)
13
12
  @room = room
14
13
  @url = "wss://" + url
15
14
  @broadcast_key = broadcast_key
16
15
  @running = false
17
- @last_ack = nil
16
+ @endpoint = Async::HTTP::Endpoint.parse(@url)
17
+ @open_handler = open_handler
18
+ @message_handler = message_handler
19
+ @close_handler = close_handler
20
+ @error_handler = error_handler
21
+ @ping_handler = ping_handler
18
22
  end
19
23
 
20
24
  def connect(task: Async::Task.current)
21
- url = @url
22
- endpoint = Async::HTTP::Endpoint.parse(url)
23
- Async::WebSocket::Client.connect(endpoint, handler: WebSocketConnection) do |connection|
24
- begin
25
- @connection = connection
26
- @running = true
27
- connection.write("SUB\t#{@broadcast_key}")
28
- connection.flush
29
- log("Connect to websocket server.")
30
- yield :status, { event: :connect, time: Time.now }
25
+ websocket = Async::WebSocket::Client.connect(@endpoint, handler: WebSocketConnection) do |connection|
26
+ @connection = connection
27
+ @running = true
28
+ send("SUB\t#{@broadcast_key}")
31
29
 
32
- ping_task = task.async do |sub|
33
- while @running
34
- sub.sleep 60
35
- begin
36
- connection.write("PING\tshowroom")
37
- connection.flush
38
- rescue => e
39
- log(e.message)
40
- end
41
- end
42
- end
30
+ log("Connect to websocket server.")
31
+ @open_handler.call
43
32
 
44
- status_task = task.async do |sub|
45
- loop do
46
- sub.sleep 1
47
- if @runing == false
48
- connection.close
49
- yield :status, { event: :close, time: Time.now }
50
- end
51
- end
33
+ ping = task.async do |task|
34
+ loop do
35
+ task.sleep 60
36
+ send("PING\tshowroom")
52
37
  end
38
+ end
53
39
 
54
- reconnect_task = task.async do |t|
55
- loop do
56
- t.sleep 10
57
- if !@last_ack.nil? && Time.now.to_i - @last_ack.to_i > 65
58
- begin
59
- connection.close
60
- rescue
61
- #
62
- ensure
63
- yield :status, { event: :close, time: Time.now }
64
- end
65
- end
66
- end
67
- end
68
- while message = connection.read
69
- if message == "ACK\tshowroom"
70
- @last_ack = Time.now
71
- yield :status, { event: :ack, time: Time.now } if message == "ACK\tshowroom"
72
- end
73
- next unless message.start_with?("MSG")
40
+ while message = connection.read
41
+ debug("ACK: #{message}")
42
+ @ping_handler.call if message == "ACK\tshowroom"
43
+
44
+ next unless message.start_with?("MSG")
74
45
 
75
- begin
76
- yield :websocket, JSON.parse(message.split("\t")[2])
77
- rescue => e
78
- SleepRoom.error(e.message)
79
- end
46
+ begin
47
+ @message_handler.call(JSON.parse(message.split("\t")[2]))
48
+ rescue JSON::ParserError => e
49
+ @error_handler.call(e)
50
+ log(e.message)
80
51
  end
81
- rescue => e
82
- yield :status, { event: :error, error: e }
83
- SleepRoom.error(e.message)
84
- ensure
85
- ping_task&.stop
86
- status_task&.stop
87
- connection.close
88
- reconnect_task&.stop
89
- log("WebSocket closed.")
90
52
  end
53
+ rescue => e
54
+ error "error"
55
+ @error_handler.call(e)
56
+ log(e.full_message)
57
+ ensure
58
+ ping&.stop
59
+ @close_handler.call(nil)
60
+ @running = false
61
+ log("WebSocket closed.")
91
62
  end
92
63
  end
93
64
 
65
+ def send(data)
66
+ debug("SEND: #{data}")
67
+ @connection.write(data)
68
+ @connection.flush
69
+ end
70
+
94
71
  def running?
95
72
  @running
96
73
  end
97
74
 
98
- attr_writer :running
99
-
100
75
  def stop
101
- @running = false
102
76
  @connection.close
103
77
  end
104
78
 
105
79
  def log(str)
106
80
  SleepRoom.info("[#{@room}] #{str}")
107
81
  end
82
+
83
+ def error(str)
84
+ SleepRoom.error("[#{@room}] #{str}")
85
+ end
86
+
87
+ def debug(str)
88
+ SleepRoom.debug("[#{@room}] #{str}")
89
+ end
90
+ end
108
91
  end
109
- end
110
- end
92
+ end
@@ -6,9 +6,14 @@ require "fileutils"
6
6
  require "tmpdir"
7
7
  require "yaml"
8
8
  require "logger"
9
+ require "dry/files"
9
10
 
10
11
  module SleepRoom
11
12
  class Error < StandardError; end
13
+ def self.files
14
+ Dry::Files.new
15
+ end
16
+
12
17
  # @return [String]
13
18
  def self.root_path
14
19
  Dir.pwd
@@ -85,15 +90,10 @@ module SleepRoom
85
90
 
86
91
  def self.init_base
87
92
  base = {
88
- web: {
89
- use: true,
90
- server: "localhost",
91
- port: 3000
92
- },
93
93
  proxy: {
94
94
  use: false,
95
95
  server: "localhost",
96
- port: 8080,
96
+ port: 1080,
97
97
  type: "socks5"
98
98
  },
99
99
  record: {
@@ -107,7 +107,8 @@ module SleepRoom
107
107
  default_save_name: "%ROOMNAME%-%TIME%.ts",
108
108
  minyami: {
109
109
  threads: 8,
110
- retries: 999
110
+ retries: 999,
111
+ no_merge: false,
111
112
  },
112
113
  logger: {
113
114
  console: true,
@@ -195,6 +196,10 @@ module SleepRoom
195
196
  SleepRoom.write_config_file(:pid, pid)
196
197
  end
197
198
 
199
+ def self.plugins
200
+
201
+ end
202
+
198
203
  def self.find_tmp_directory(output, call_time)
199
204
  regex = /Proccessing (.*) finished./
200
205
  output = "#{configatron.save_path}/#{output}"
@@ -229,6 +234,12 @@ module SleepRoom
229
234
  log(:info, string)
230
235
  end
231
236
 
237
+ # @param string [String]
238
+ # @return [nil]
239
+ def self.debug(string)
240
+ log(:debug, string) if ENV["SR_DEBUG"]
241
+ end
242
+
232
243
  # @param string [String]
233
244
  # @return [nil]
234
245
  def self.warning(string)
@@ -250,6 +261,8 @@ module SleepRoom
250
261
  warn("[WARN] #{log}".colorize(:yellow))
251
262
  when :error
252
263
  puts("[ERROR] #{log}".colorize(:red))
264
+ when :debug
265
+ puts("[DEBUG] #{log}".colorize(:gray))
253
266
  end
254
267
  end
255
268
  file_logger(type, log) if configatron.logger.file.use == true
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SleepRoom
4
- VERSION = "0.9.0.beta1"
4
+ VERSION = "0.9.0.beta3"
5
5
  end
data/sleeproom.gemspec CHANGED
@@ -25,15 +25,15 @@ Gem::Specification.new do |spec|
25
25
  spec.executables = ["sleeproom"]
26
26
  spec.require_paths = ["lib"]
27
27
 
28
- spec.add_runtime_dependency("async", "~> 1.26.0")
29
- spec.add_runtime_dependency("async-http-faraday", "~> 0.9.0")
30
- spec.add_runtime_dependency("async-websocket", "~> 0.15.0")
31
- spec.add_runtime_dependency("colorize", "~> 0.8.0")
32
- spec.add_runtime_dependency("configatron", "~> 4.5.0")
33
- spec.add_runtime_dependency("falcon", "~> 0.36.0")
34
- spec.add_runtime_dependency("roda", "~> 3.33.0")
35
- spec.add_runtime_dependency("ruby-next-core", "~> 0.9.0")
36
- spec.add_runtime_dependency("terminal-table", "~> 1.8.0")
28
+ spec.add_runtime_dependency("async", "~> 1.29")
29
+ spec.add_runtime_dependency("async-http-faraday", "~> 0.9")
30
+ spec.add_runtime_dependency("async-websocket", "~> 0.18")
31
+ spec.add_runtime_dependency("colorize", "~> 0.8")
32
+ spec.add_runtime_dependency("configatron", "~> 4.5")
33
+ spec.add_runtime_dependency("ruby-next-core", "~> 0.9")
34
+ spec.add_runtime_dependency("terminal-table", "~> 1.8")
35
+ spec.add_runtime_dependency("dry-files", "~> 0.1")
36
+ spec.add_runtime_dependency("dry-auto_inject", "~> 0.6")
37
37
 
38
38
  spec.post_install_message = <<~STR
39
39
  SleepRoom 需要:
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sleeproom
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0.beta1
4
+ version: 0.9.0.beta3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Koell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-20 00:00:00.000000000 Z
11
+ date: 2021-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -16,126 +16,126 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.26.0
19
+ version: '1.29'
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: 1.26.0
26
+ version: '1.29'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: async-http-faraday
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.9.0
33
+ version: '0.9'
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.9.0
40
+ version: '0.9'
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.15.0
47
+ version: '0.18'
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.15.0
54
+ version: '0.18'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: colorize
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.8.0
61
+ version: '0.8'
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.8.0
68
+ version: '0.8'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: configatron
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 4.5.0
75
+ version: '4.5'
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: 4.5.0
82
+ version: '4.5'
83
83
  - !ruby/object:Gem::Dependency
84
- name: falcon
84
+ name: ruby-next-core
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.36.0
89
+ version: '0.9'
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.36.0
96
+ version: '0.9'
97
97
  - !ruby/object:Gem::Dependency
98
- name: roda
98
+ name: terminal-table
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 3.33.0
103
+ version: '1.8'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 3.33.0
110
+ version: '1.8'
111
111
  - !ruby/object:Gem::Dependency
112
- name: ruby-next-core
112
+ name: dry-files
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 0.9.0
117
+ version: '0.1'
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 0.9.0
124
+ version: '0.1'
125
125
  - !ruby/object:Gem::Dependency
126
- name: terminal-table
126
+ name: dry-auto_inject
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 1.8.0
131
+ version: '0.6'
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 1.8.0
138
+ version: '0.6'
139
139
  description:
140
140
  email:
141
141
  - i@wug.moe
@@ -149,7 +149,6 @@ files:
149
149
  - ".rubocop.yml"
150
150
  - ".rubocop_todo.yml"
151
151
  - Gemfile
152
- - Gemfile.lock
153
152
  - LICENSE.txt
154
153
  - README.md
155
154
  - Rakefile
@@ -161,9 +160,10 @@ files:
161
160
  - lib/sleeproom/record/api/room.rb
162
161
  - lib/sleeproom/record/api/room_api.rb
163
162
  - lib/sleeproom/record/api/streaming_api.rb
163
+ - lib/sleeproom/record/plugins.rb
164
+ - lib/sleeproom/record/plugins/youtube/upload.rb
164
165
  - lib/sleeproom/record/record.rb
165
166
  - lib/sleeproom/record/tasks.rb
166
- - lib/sleeproom/record/web/app.rb
167
167
  - lib/sleeproom/record/websocket.rb
168
168
  - lib/sleeproom/record/write_status.rb
169
169
  - lib/sleeproom/utils.rb
@@ -193,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
193
193
  - !ruby/object:Gem::Version
194
194
  version: 1.3.1
195
195
  requirements: []
196
- rubygems_version: 3.1.4
196
+ rubygems_version: 3.2.3
197
197
  signing_key:
198
198
  specification_version: 4
199
199
  summary: sleeproom
data/Gemfile.lock DELETED
@@ -1,158 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- sleeproom (0.9.0.beta1)
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
- falcon (~> 0.36.0)
11
- roda (~> 3.33.0)
12
- ruby-next-core (~> 0.9.0)
13
- terminal-table (~> 1.8.0)
14
-
15
- GEM
16
- remote: https://rubygems.org/
17
- specs:
18
- activesupport (6.0.3.2)
19
- concurrent-ruby (~> 1.0, >= 1.0.2)
20
- i18n (>= 0.7, < 2)
21
- minitest (~> 5.1)
22
- tzinfo (~> 1.1)
23
- zeitwerk (~> 2.2, >= 2.2.2)
24
- ast (2.4.1)
25
- async (1.26.2)
26
- console (~> 1.0)
27
- nio4r (~> 2.3)
28
- timers (~> 4.1)
29
- async-container (0.16.6)
30
- async (~> 1.0)
31
- async-io (~> 1.26)
32
- async-http (0.52.4)
33
- async (~> 1.25)
34
- async-io (~> 1.28)
35
- async-pool (~> 0.2)
36
- protocol-http (~> 0.20.0)
37
- protocol-http1 (~> 0.13.0)
38
- protocol-http2 (~> 0.14.0)
39
- async-http-cache (0.2.0)
40
- async-http (~> 0.51)
41
- async-http-faraday (0.9.0)
42
- async-http (~> 0.42)
43
- faraday
44
- async-io (1.30.0)
45
- async (~> 1.14)
46
- async-pool (0.3.2)
47
- async (~> 1.25)
48
- async-websocket (0.15.0)
49
- async-http (~> 0.51)
50
- async-io (~> 1.23)
51
- protocol-websocket (~> 0.7.0)
52
- build-environment (1.13.0)
53
- colorize (0.8.1)
54
- concurrent-ruby (1.1.6)
55
- configatron (4.5.1)
56
- console (1.8.2)
57
- diff-lcs (1.3)
58
- falcon (0.36.4)
59
- async (~> 1.13)
60
- async-container (~> 0.16.0)
61
- async-http (~> 0.52.0)
62
- async-http-cache (~> 0.2.0)
63
- async-io (~> 1.22)
64
- build-environment (~> 1.13)
65
- localhost (~> 1.1)
66
- process-metrics (~> 0.2.0)
67
- rack (>= 1.0)
68
- samovar (~> 2.1)
69
- faraday (1.0.1)
70
- multipart-post (>= 1.2, < 3)
71
- i18n (1.8.3)
72
- concurrent-ruby (~> 1.0)
73
- jaro_winkler (1.5.4)
74
- localhost (1.1.6)
75
- mapping (1.1.1)
76
- minitest (5.14.1)
77
- multipart-post (2.1.1)
78
- nio4r (2.5.2)
79
- parallel (1.19.2)
80
- parser (2.7.1.4)
81
- ast (~> 2.4.1)
82
- process-metrics (0.2.1)
83
- console (~> 1.8)
84
- samovar (~> 2.1)
85
- protocol-hpack (1.4.2)
86
- protocol-http (0.20.0)
87
- protocol-http1 (0.13.0)
88
- protocol-http (~> 0.19)
89
- protocol-http2 (0.14.0)
90
- protocol-hpack (~> 1.4)
91
- protocol-http (~> 0.18)
92
- protocol-websocket (0.7.4)
93
- protocol-http (~> 0.2)
94
- protocol-http1 (~> 0.2)
95
- rack (2.2.3)
96
- rainbow (3.0.0)
97
- rake (13.0.1)
98
- rexml (3.2.4)
99
- roda (3.33.0)
100
- rack
101
- rspec (3.9.0)
102
- rspec-core (~> 3.9.0)
103
- rspec-expectations (~> 3.9.0)
104
- rspec-mocks (~> 3.9.0)
105
- rspec-core (3.9.2)
106
- rspec-support (~> 3.9.3)
107
- rspec-expectations (3.9.2)
108
- diff-lcs (>= 1.2.0, < 2.0)
109
- rspec-support (~> 3.9.0)
110
- rspec-mocks (3.9.1)
111
- diff-lcs (>= 1.2.0, < 2.0)
112
- rspec-support (~> 3.9.0)
113
- rspec-support (3.9.3)
114
- rubocop (0.82.0)
115
- jaro_winkler (~> 1.5.1)
116
- parallel (~> 1.10)
117
- parser (>= 2.7.0.1)
118
- rainbow (>= 2.2.2, < 4.0)
119
- rexml
120
- ruby-progressbar (~> 1.7)
121
- unicode-display_width (>= 1.4.0, < 2.0)
122
- rubocop-github (0.16.0)
123
- rubocop (<= 0.82.0)
124
- rubocop-performance (~> 1.0)
125
- rubocop-rails (~> 2.0)
126
- rubocop-performance (1.6.1)
127
- rubocop (>= 0.71.0)
128
- rubocop-rails (2.6.0)
129
- activesupport (>= 4.2.0)
130
- rack (>= 1.1)
131
- rubocop (>= 0.82.0)
132
- ruby-next-core (0.9.2)
133
- ruby-progressbar (1.10.1)
134
- samovar (2.1.4)
135
- console (~> 1.0)
136
- mapping (~> 1.0)
137
- terminal-table (1.8.0)
138
- unicode-display_width (~> 1.1, >= 1.1.1)
139
- thread_safe (0.3.6)
140
- timers (4.3.0)
141
- tzinfo (1.2.7)
142
- thread_safe (~> 0.1)
143
- unicode-display_width (1.7.0)
144
- zeitwerk (2.3.0)
145
-
146
- PLATFORMS
147
- ruby
148
- x64-mingw32
149
-
150
- DEPENDENCIES
151
- rake (~> 13.0)
152
- rspec (~> 3.0)
153
- rubocop-github
154
- rubocop-performance
155
- sleeproom!
156
-
157
- BUNDLED WITH
158
- 2.1.4
@@ -1,53 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "roda"
4
- module SleepRoom
5
- module Web
6
- class App < Roda
7
- plugin :default_headers,
8
- "Content-Type" => "application/json",
9
- "X-Frame-Options" => "deny",
10
- "X-Content-Type-Options" => "nosniff",
11
- "X-XSS-Protection" => "1; mode=block"
12
- plugin :content_security_policy do |csp|
13
- csp.default_src :none
14
- csp.style_src :self
15
- csp.form_action :self
16
- csp.script_src :self
17
- csp.connect_src :self
18
- csp.base_uri :none
19
- csp.frame_ancestors :none
20
- end
21
- plugin :public
22
- plugin :multi_route
23
- plugin :not_found do
24
- end
25
- plugin :error_handler do |e|
26
- $stderr.print "#{e.class}: #{e.message}\n"
27
- warn e.backtrace
28
- next exception_page(e, assets: true) if ENV["RACK_ENV"] == "development"
29
- end
30
-
31
- route "status" do |r|
32
- SleepRoom.load_status.sort_by { |hash| hash[:group] }.to_json
33
- end
34
-
35
- route "lists" do |r|
36
- r.get do
37
- SleepRoom.load_config(:record).to_json
38
- end
39
-
40
- r.post do
41
- end
42
- end
43
- route do |r|
44
- r.public
45
- r.multi_route
46
-
47
- r.root do
48
- "SleepRoom Web API"
49
- end
50
- end
51
- end
52
- end
53
- end