]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | Copyright (C) 2024 Rubén Beltrán del Río | |
3 | ||
4 | This program is free software: you can redistribute it and/or modify | |
5 | it under the terms of the GNU General Public License as published by | |
6 | the Free Software Foundation, either version 3 of the License, or | |
7 | (at your option) any later version. | |
8 | ||
9 | This program is distributed in the hope that it will be useful, | |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | GNU General Public License for more details. | |
13 | ||
14 | You should have received a copy of the GNU General Public License | |
15 | along with this program. If not, see https://captura.tranquil.systems. | |
16 | */ | |
17 | import Foundation | |
18 | ||
19 | protocol ConfigureActionProtocol { | |
20 | var action: String { get } | |
21 | var fps: Int? { get } | |
22 | var outputs: OutputFormatSetting? { get } | |
23 | var backend: URL? { get } | |
24 | var backendOutput: OutputFormatSetting? { get } | |
25 | var keepLocalFiles: Bool? { get } | |
26 | } | |
27 | ||
28 | protocol RecordActionProtocol { | |
29 | var action: String { get } | |
30 | ||
31 | var x: Int? { get } | |
32 | var y: Int? { get } | |
33 | var width: Int? { get } | |
34 | var height: Int? { get } | |
35 | var preventResize: Bool? { get } | |
36 | var preventMove: Bool? { get } | |
37 | var fps: Int? { get } | |
38 | var backend: URL? { get } | |
39 | var outputs: OutputFormatSetting? { get } | |
40 | var backendOutput: OutputFormatSetting? { get } | |
41 | var keepLocalFiles: Bool? { get } | |
42 | var autoStart: Bool? { get } | |
43 | var skipBackend: Bool { get } | |
44 | var maxLength: Int? { get } | |
45 | } | |
46 | ||
47 | // The concrete implementations | |
48 | struct ConfigureAction: ConfigureActionProtocol { | |
49 | let action: String | |
50 | var fps: Int? | |
51 | var outputs: OutputFormatSetting? | |
52 | var backend: URL? | |
53 | var backendOutput: OutputFormatSetting? | |
54 | var keepLocalFiles: Bool? | |
55 | } | |
56 | ||
57 | struct RecordAction: RecordActionProtocol { | |
58 | let action: String | |
59 | var x: Int? | |
60 | var y: Int? | |
61 | var width: Int? | |
62 | var height: Int? | |
63 | var preventResize: Bool? | |
64 | var preventMove: Bool? | |
65 | var fps: Int? | |
66 | var outputs: OutputFormatSetting? | |
67 | var backend: URL? | |
68 | var backendOutput: OutputFormatSetting? | |
69 | var keepLocalFiles: Bool? | |
70 | var autoStart: Bool? | |
71 | var skipBackend: Bool | |
72 | var maxLength: Int? | |
73 | } | |
74 | ||
75 | enum CapturaAction { | |
76 | case record(RecordAction) | |
77 | case configure(ConfigureAction) | |
78 | } | |
79 | ||
80 | struct CapturaURLDecoder { | |
81 | ||
82 | static func decodeParams(url: URL) -> CapturaAction? { | |
83 | guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false), | |
84 | let params = components.queryItems | |
85 | else { | |
86 | return nil | |
87 | } | |
88 | ||
89 | var paramsDict = [String: Any]() | |
90 | ||
91 | params.forEach { item in | |
92 | paramsDict[item.name] = item.value | |
93 | } | |
94 | ||
95 | guard let action = paramsDict["action"] as? String else { | |
96 | return nil | |
97 | } | |
98 | ||
99 | switch action { | |
100 | case "configure": | |
101 | var fps = Int(paramsDict["fps"] as? String ?? "") | |
102 | let backend = URL(string: paramsDict["backend"] as? String ?? "") | |
103 | let keepLocalFiles = Bool(paramsDict["keep_local_files"] as? String ?? "") | |
104 | let outputs = OutputFormatSetting(paramsDict["outputs"] as? String ?? "") | |
105 | var backendOutput = OutputFormatSetting(paramsDict["backend_output"] as? String ?? "") | |
106 | ||
107 | if fps != nil { | |
108 | fps = min(10, max(4, fps!)) | |
109 | } | |
110 | ||
111 | if backendOutput == .all { | |
112 | backendOutput = .gifOnly | |
113 | } | |
114 | ||
115 | return .configure( | |
116 | ConfigureAction( | |
117 | action: action, | |
118 | fps: fps, | |
119 | outputs: outputs, | |
120 | backend: backend, | |
121 | backendOutput: backendOutput, | |
122 | keepLocalFiles: keepLocalFiles | |
123 | )) | |
124 | ||
125 | case "record": | |
126 | let x = Int(paramsDict["x"] as? String ?? "") | |
127 | let y = Int(paramsDict["y"] as? String ?? "") | |
128 | let width = Int(paramsDict["width"] as? String ?? "") | |
129 | let height = Int(paramsDict["height"] as? String ?? "") | |
130 | let preventResize = Bool(paramsDict["prevent_resize"] as? String ?? "") | |
131 | let preventMove = Bool(paramsDict["prevent_move"] as? String ?? "") | |
132 | var fps = Int(paramsDict["fps"] as? String ?? "") | |
133 | let backend = URL(string: paramsDict["backend"] as? String ?? "") | |
134 | let keepLocalFiles = Bool(paramsDict["keep_local_files"] as? String ?? "") | |
135 | let outputs = OutputFormatSetting(paramsDict["outputs"] as? String ?? "") | |
136 | var backendOutput = OutputFormatSetting(paramsDict["backend_output"] as? String ?? "") | |
137 | let autoStart = Bool(paramsDict["auto_start"] as? String ?? "") | |
138 | var maxLength = Int(paramsDict["max_length"] as? String ?? "") | |
139 | ||
140 | if fps != nil { | |
141 | fps = min(10, max(4, fps!)) | |
142 | } | |
143 | ||
144 | if maxLength != nil { | |
145 | maxLength = min(300, max(1, fps!)) | |
146 | } | |
147 | ||
148 | if backendOutput == .all { | |
149 | backendOutput = .gifOnly | |
150 | } | |
151 | ||
152 | var skipBackend = false | |
153 | if let backendString = paramsDict["backend"] as? String { | |
154 | if backendString == "" { | |
155 | skipBackend = true | |
156 | } | |
157 | } | |
158 | ||
159 | return .record( | |
160 | RecordAction( | |
161 | action: action, | |
162 | x: x, | |
163 | y: y, | |
164 | width: width, | |
165 | height: height, | |
166 | preventResize: preventResize, | |
167 | preventMove: preventMove, | |
168 | fps: fps, | |
169 | outputs: outputs, | |
170 | backend: backend, | |
171 | backendOutput: backendOutput, | |
172 | keepLocalFiles: keepLocalFiles, | |
173 | autoStart: autoStart, | |
174 | skipBackend: skipBackend, | |
175 | maxLength: maxLength | |
176 | )) | |
177 | ||
178 | default: | |
179 | return nil | |
180 | } | |
181 | } | |
182 | } |