sony_camera_remote_api 0.2.2 → 0.3.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/Gemfile +5 -0
- data/README.md +11 -9
- data/lib/sony_camera_remote_api/camera_api.rb +17 -37
- data/lib/sony_camera_remote_api/client/main.rb +2 -2
- data/lib/sony_camera_remote_api/client/shelf.rb +2 -2
- data/lib/sony_camera_remote_api/raw_api.rb +4 -13
- data/lib/sony_camera_remote_api/retrying.rb +105 -0
- data/lib/sony_camera_remote_api/scripts.rb +4 -4
- data/lib/sony_camera_remote_api/shelf.rb +2 -2
- data/lib/sony_camera_remote_api/version.rb +1 -1
- data/lib/sony_camera_remote_api.rb +31 -62
- data/scripts/Darwin/add_ssdp_route.sh +61 -0
- data/scripts/Darwin/connect_wifi.sh +108 -0
- data/scripts/Linux/connect_wifi.sh +38 -33
- data/scripts/connect.sh +12 -7
- data/sony_camera_remote_api.gemspec +1 -1
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6cffaf29bb654037c1468ab6ef14e78cbd966979
|
4
|
+
data.tar.gz: 71d002fd2b81d58c40bd4a1602c5434cdd2aa8dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d354a41277b0ca16ebb1a861958c545ceb66f3c8d4b8fb8b208867a02038340b873a00e21f9343706b8a2cfd853d64c7111865a752e5e3c9efa3c454c4ebfce5
|
7
|
+
data.tar.gz: 848e7169aff5e97ba6a95c4d6360a3160a227cc0e890cc585dac5d7f9637c1331f053fed5ff7984b5ace0fa8ebdb60a5ef80c9ffaccd672f5f7c79b605e4673e
|
data/Gemfile
CHANGED
@@ -2,3 +2,8 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in sony_camera_remote_api.gemspec
|
4
4
|
gemspec
|
5
|
+
|
6
|
+
if Gem::Version.create(RUBY_VERSION) < Gem::Version.create("2.2.2")
|
7
|
+
# NOTE: activesupport 5.x supports only ruby 2.2.2+
|
8
|
+
gem "activesupport", ">= 4.0.0", "< 5.0.0"
|
9
|
+
end
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# Sony Camera Remote API Wrapper
|
2
2
|
|
3
|
+
[](https://badge.fury.io/rb/sony_camera_remote_api)
|
4
|
+
|
3
5
|
A Ruby Gem that facilitates the use of Sony Camera Remote API.
|
4
6
|
|
5
7
|
- [Backgrounds](#backgrounds)
|
@@ -21,12 +23,12 @@ This gem is a wrapper library that make it easy to use Sony camera functions for
|
|
21
23
|
|
22
24
|
## Features
|
23
25
|
|
26
|
+
* Easy connection to camera
|
24
27
|
* Streaming live-view images by one method
|
25
28
|
* Simplified contents transfer
|
26
29
|
* Consistent interface for changing parameters safely
|
27
30
|
* Auto reconnection
|
28
|
-
*
|
29
|
-
* Client application bundled
|
31
|
+
* CLI application bundled (like [Raspberry Pi camera application](https://www.raspberrypi.org/documentation/raspbian/applications/camera.md))
|
30
32
|
|
31
33
|
|
32
34
|
## Supported version
|
@@ -52,28 +54,28 @@ Or install it yourself as:
|
|
52
54
|
|
53
55
|
## Usage
|
54
56
|
|
55
|
-
1. Connect your PC (or device) to the camera with Direct Wi-Fi. If
|
56
|
-
Shelf class like the following example.
|
57
|
+
1. Connect your PC (or device) to the camera with Direct Wi-Fi. If your PC is **Linux** or **MacOS** machine, you can easiy do it by using `Shelf` class like following example.
|
57
58
|
2. Create SonyCameraRemoteAPI::Camera instance with Shelf instance.
|
58
59
|
3. Now you can access all of camera APIs and useful wrapper methods!
|
59
60
|
|
60
|
-
This is an example code
|
61
|
+
This is an example code that takes a picture and transfer it to your PC.
|
61
62
|
|
62
63
|
```ruby
|
63
64
|
require 'sony_camera_remote_api'
|
64
65
|
|
65
|
-
|
66
|
-
|
67
|
-
|
66
|
+
ssid = "DIRECT-xxxx:ILCE-QX1" # SSID of camera
|
67
|
+
pass = "xxxxxxxx" # passphrase
|
68
|
+
interface = "wlan0" # interface by which you connect to the camera
|
68
69
|
|
70
|
+
# Connect to the camera
|
69
71
|
shelf = SonyCameraRemoteAPI::Shelf.new 'sonycam.shelf'
|
70
72
|
shelf.add_and_select ssid, pass, interface
|
71
73
|
shelf.connect
|
72
74
|
|
75
|
+
# Initialize Camera class instance, with which you can access all camera functions.
|
73
76
|
cam = SonyCameraRemoteAPI::Camera.new shelf
|
74
77
|
cam.change_function_to_shoot 'still', 'Single'
|
75
78
|
cam.capture_still
|
76
|
-
# => Captured jpeg file is transferred to your PC
|
77
79
|
```
|
78
80
|
|
79
81
|
For more information, see project's [Wiki](https://github.com/kota65535/sony_camera_remote_api/wiki).
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'sony_camera_remote_api/raw_api'
|
2
2
|
require 'sony_camera_remote_api/camera_api_group'
|
3
|
+
require 'sony_camera_remote_api/retrying'
|
3
4
|
require 'forwardable'
|
4
5
|
|
5
6
|
module SonyCameraRemoteAPI
|
@@ -26,9 +27,18 @@ module SonyCameraRemoteAPI
|
|
26
27
|
# @param [Hash] endpoints
|
27
28
|
# @param [Proc] reconnect_by
|
28
29
|
def initialize(endpoints, reconnect_by: nil)
|
29
|
-
@
|
30
|
+
@http = HTTPClient.new
|
31
|
+
@http.connect_timeout = @http.send_timeout = @http.receive_timeout = 30
|
32
|
+
|
33
|
+
Retrying.new(reconnect_by, @http).reconnect_and_retry do
|
34
|
+
@raw_api_manager = RawAPIManager.new endpoints, @http
|
35
|
+
end
|
36
|
+
|
30
37
|
@api_group_manager = CameraAPIGroupManager.new self
|
31
|
-
|
38
|
+
|
39
|
+
@retrying = Retrying.new(reconnect_by, @http).add_common_hook do
|
40
|
+
startRecMode! timeout: 0
|
41
|
+
end
|
32
42
|
end
|
33
43
|
|
34
44
|
|
@@ -40,7 +50,7 @@ module SonyCameraRemoteAPI
|
|
40
50
|
params = [params] unless params.is_a? Array
|
41
51
|
name, service, id, version = @raw_api_manager.search_method(__method__, **opts)
|
42
52
|
response = nil
|
43
|
-
reconnect_and_retry do
|
53
|
+
@retrying.reconnect_and_retry do
|
44
54
|
if params[0]
|
45
55
|
response = @raw_api_manager.call_api_async(service, name, params, id, version, opts[:timeout])
|
46
56
|
else
|
@@ -55,7 +65,8 @@ module SonyCameraRemoteAPI
|
|
55
65
|
# @return [Hash] Response of API
|
56
66
|
def getAvailableApiList(params = [], **opts)
|
57
67
|
name, service, id, version = @raw_api_manager.search_method(__method__, **opts)
|
58
|
-
|
68
|
+
log.debug "calling: #{name}"
|
69
|
+
@retrying.reconnect_and_retry do
|
59
70
|
@raw_api_manager.call_api(service, name, params, id, version)
|
60
71
|
end
|
61
72
|
end
|
@@ -130,9 +141,10 @@ module SonyCameraRemoteAPI
|
|
130
141
|
method = method.to_s.delete('!').to_sym
|
131
142
|
params = [params] unless params.is_a? Array
|
132
143
|
response = nil
|
133
|
-
reconnect_and_retry do
|
144
|
+
@retrying.reconnect_and_retry do
|
134
145
|
begin
|
135
146
|
name, service, id, version = @raw_api_manager.search_method(method, **opts)
|
147
|
+
log.debug "calling: #{name}"
|
136
148
|
if service == 'camera' || name == ''
|
137
149
|
if opts[:timeout]
|
138
150
|
response = call_api_safe(service, name, params, id, version, opts[:timeout], **opts)
|
@@ -202,37 +214,5 @@ module SonyCameraRemoteAPI
|
|
202
214
|
getEvent(false)
|
203
215
|
end
|
204
216
|
|
205
|
-
|
206
|
-
# Execute given block. And if the block raises Error caused by Wi-Fi disconnection,
|
207
|
-
# Reconnect by @reconnect_by Proc and retry the given block.
|
208
|
-
# @param [Boolean] retrying If true, retry given block. If false, return immediately after reconnection.
|
209
|
-
# @param [Fixnum] num Number of retry.
|
210
|
-
# @param [Proc] hook Hook method called after reconnection.
|
211
|
-
def reconnect_and_retry(retrying: true, num: 1, hook: nil)
|
212
|
-
yield
|
213
|
-
rescue HTTPClient::TimeoutError, Errno::EHOSTUNREACH, Errno::ECONNREFUSED => e
|
214
|
-
retry_count ||= 0
|
215
|
-
retry_count += 1
|
216
|
-
raise e if @reconnect_by.nil? || retry_count > num
|
217
|
-
log.error "#{e.class}: #{e.message}"
|
218
|
-
log.error 'The camera seems to be disconnected! Reconnecting...'
|
219
|
-
unless @reconnect_by.call
|
220
|
-
log.error 'Failed to reconnect.'
|
221
|
-
raise e
|
222
|
-
end
|
223
|
-
log.error 'Reconnected.'
|
224
|
-
@raw_api_manager.reset_connection
|
225
|
-
# For cameras that use Smart Remote Control app.
|
226
|
-
startRecMode! timeout: 0
|
227
|
-
return unless retrying
|
228
|
-
|
229
|
-
if hook
|
230
|
-
unless hook.call
|
231
|
-
log.error 'Before-retry hook failed.'
|
232
|
-
raise e
|
233
|
-
end
|
234
|
-
end
|
235
|
-
retry
|
236
|
-
end
|
237
217
|
end
|
238
218
|
end
|
@@ -442,13 +442,13 @@ module SonyCameraRemoteAPI
|
|
442
442
|
end
|
443
443
|
|
444
444
|
|
445
|
-
desc '
|
445
|
+
desc 'intstill [options]', 'Do interval recording'
|
446
446
|
option :time, type: :numeric, desc: 'Recording time (sec)', banner: 'NSEC'
|
447
447
|
option :interval, type: :string, desc: 'Interval (sec)', banner: 'NSEC'
|
448
448
|
still_common_options
|
449
449
|
common_options
|
450
450
|
option :transfer, type: :boolean, desc: 'Transfer selected contents '
|
451
|
-
def
|
451
|
+
def intstill
|
452
452
|
init_camera
|
453
453
|
@cam.change_function_to_shoot('intervalstill')
|
454
454
|
|
@@ -187,9 +187,9 @@ module SonyCameraRemoteAPI
|
|
187
187
|
|
188
188
|
# Connect to camera by external script
|
189
189
|
if options[:restart]
|
190
|
-
result =
|
190
|
+
result = @shelf.reconnect camera['ssid']
|
191
191
|
else
|
192
|
-
result =
|
192
|
+
result = @shelf.connect camera['ssid']
|
193
193
|
end
|
194
194
|
unless result
|
195
195
|
puts 'Failed to connect!'
|
@@ -30,10 +30,9 @@ module SonyCameraRemoteAPI
|
|
30
30
|
|
31
31
|
|
32
32
|
# @param [Hash] endpoints Endpoint URIs
|
33
|
-
def initialize(endpoints)
|
33
|
+
def initialize(endpoints, httpclient)
|
34
34
|
@endpoints = endpoints
|
35
|
-
@
|
36
|
-
@cli.connect_timeout = @cli.send_timeout = @cli.receive_timeout = 30
|
35
|
+
@http = httpclient
|
37
36
|
|
38
37
|
unless call_api('camera', 'getApplicationInfo', [], 1, '1.0').result[1] >= '2.0.0'
|
39
38
|
raise ServerNotCompatible, 'API version of the server < 2.0.0.'
|
@@ -83,7 +82,7 @@ module SonyCameraRemoteAPI
|
|
83
82
|
}
|
84
83
|
# log.debug request
|
85
84
|
begin
|
86
|
-
raw_response = @
|
85
|
+
raw_response = @http.post_content(@endpoints[service_type], request.to_json)
|
87
86
|
rescue HTTPClient::BadResponseError => e
|
88
87
|
if e.res.status_code == 403
|
89
88
|
raise APIForbidden.new, "Method '#{method}' returned 403 Forbidden error. Maybe this method is not allowed to general users."
|
@@ -116,7 +115,7 @@ module SonyCameraRemoteAPI
|
|
116
115
|
'id' => id,
|
117
116
|
'version' => version
|
118
117
|
}
|
119
|
-
conn = @
|
118
|
+
conn = @http.post_async(@endpoints[service_type], request.to_json)
|
120
119
|
start_time = Time.now if timeout
|
121
120
|
loop do
|
122
121
|
break if conn.finished?
|
@@ -184,13 +183,5 @@ module SonyCameraRemoteAPI
|
|
184
183
|
def support?(method)
|
185
184
|
@apis.key? method
|
186
185
|
end
|
187
|
-
|
188
|
-
|
189
|
-
# Reset HTTPClient.
|
190
|
-
# @return [void]
|
191
|
-
def reset_connection
|
192
|
-
@cli.reset_all
|
193
|
-
end
|
194
|
-
|
195
186
|
end
|
196
187
|
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'sony_camera_remote_api/logging'
|
2
|
+
|
3
|
+
module SonyCameraRemoteAPI
|
4
|
+
class Retrying
|
5
|
+
include Logging
|
6
|
+
|
7
|
+
RECONNECTION_INTERVAL = 5
|
8
|
+
DEFAULT_RETRY_LIMIT = 2
|
9
|
+
DEFAULT_RECONNECTION_LIMIT = 2
|
10
|
+
|
11
|
+
|
12
|
+
def initialize(reconnect_by, httpclient)
|
13
|
+
@reconnect_by = reconnect_by
|
14
|
+
@http = httpclient
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def reconnect_and_retry(retry_limit: DEFAULT_RETRY_LIMIT,
|
19
|
+
reconnection_limit: DEFAULT_RECONNECTION_LIMIT,
|
20
|
+
hook: nil, &block)
|
21
|
+
reconnect_and_retry_inner(retry_limit, reconnection_limit, hook, &block)
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def reconnect_and_give_up(reconnection_limit: DEFAULT_RECONNECTION_LIMIT,
|
26
|
+
hook: nil, &block)
|
27
|
+
reconnect_and_retry_inner(0, reconnection_limit, hook, &block)
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def reconnect_and_retry_forever(hook: nil, &block)
|
32
|
+
reconnect_and_retry_inner(:forever, :forever, hook, &block)
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
def add_common_hook(&block)
|
37
|
+
@common_hook = block
|
38
|
+
self
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
# Execute given block with reconnection and retry.
|
45
|
+
# When the given block raises Error caused by Wi-Fi disconnection,
|
46
|
+
# Try to reconnect by @reconnect_by Proc, and then execute again the given block.
|
47
|
+
# @param [Fixnum] retry_limit Limit number of retrying given block.
|
48
|
+
# @param [Fixnum] reconnection_limit Limit number of retrying reconnection.
|
49
|
+
# @param [Proc] one_off_hook Hook method called after reconnection.
|
50
|
+
def reconnect_and_retry_inner(retry_limit, reconnection_limit, one_off_hook)
|
51
|
+
# Try to execute the given block by 'retry_limit' times.
|
52
|
+
yield
|
53
|
+
rescue HTTPClient::BadResponseError, HTTPClient::TimeoutError, Errno::EHOSTUNREACH, Errno::ECONNREFUSED => e
|
54
|
+
# Reraise immediately if reconnection is disabled
|
55
|
+
raise e if @reconnect_by.nil?
|
56
|
+
|
57
|
+
log.error "#{e.class}: #{e.message}"
|
58
|
+
# Init retry_count
|
59
|
+
retry_count ||= 0
|
60
|
+
if retry_count == 0
|
61
|
+
log.error 'The camera seems to be disconnected, starting retry sequence.'
|
62
|
+
forever = retry_limit.is_a?(Symbol) && retry_limit == :forever
|
63
|
+
else
|
64
|
+
if forever || retry_count < retry_limit
|
65
|
+
log.error "Failed to execute the block! (#{retry_count}/#{retry_limit})"
|
66
|
+
else
|
67
|
+
log.error 'Execution failed! Finishing retry sequence...'
|
68
|
+
raise e
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# Try to reconnect by 'reconnection_limit' times.
|
73
|
+
unless try_to_reconnect reconnection_limit
|
74
|
+
log.error 'Reconnection failed! Finishing retry sequence...'
|
75
|
+
raise e
|
76
|
+
end
|
77
|
+
|
78
|
+
# Call hooks
|
79
|
+
@common_hook.call if @common_hook
|
80
|
+
one_off_hook.call if one_off_hook
|
81
|
+
|
82
|
+
# Increment retry count
|
83
|
+
retry_count += 1
|
84
|
+
retry
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
def try_to_reconnect(limit)
|
89
|
+
log.error 'Reconnecting...'
|
90
|
+
forever = limit.is_a?(Symbol) && limit == :forever
|
91
|
+
reconnection_count = 0
|
92
|
+
loop do
|
93
|
+
reconnection_count += 1
|
94
|
+
return false unless forever || reconnection_count <= limit
|
95
|
+
break if @reconnect_by.call
|
96
|
+
log.error "Failed to reconnect! Retrying... (#{reconnection_count}/#{limit})"
|
97
|
+
sleep RECONNECTION_INTERVAL
|
98
|
+
end
|
99
|
+
@http.reset_all
|
100
|
+
log.error 'Reconnected.'
|
101
|
+
true
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
end
|
@@ -12,8 +12,8 @@ module SonyCameraRemoteAPI
|
|
12
12
|
# @param [String] ssid SSID of the camera to connect
|
13
13
|
# @param [String] pass Password of the camera to connect
|
14
14
|
# @return [Boolean] +true+ if succeeded, +false+ otherwise.
|
15
|
-
def connect(
|
16
|
-
run_external_command "sudo bash #{connection_script} #{
|
15
|
+
def connect(ssid, pass, interface)
|
16
|
+
run_external_command "sudo bash #{connection_script} #{ssid} #{pass} #{interface}"
|
17
17
|
end
|
18
18
|
|
19
19
|
|
@@ -22,8 +22,8 @@ module SonyCameraRemoteAPI
|
|
22
22
|
# @param [String] ssid SSID of the camera to connect
|
23
23
|
# @param [String] pass Password of the camera to connect
|
24
24
|
# @return [Boolean] +true+ if succeeded, +false+ otherwise.
|
25
|
-
def restart_and_connect(
|
26
|
-
run_external_command "sudo bash #{connection_script} -r #{
|
25
|
+
def restart_and_connect(ssid, pass, interface)
|
26
|
+
run_external_command "sudo bash #{connection_script} -r #{ssid} #{pass} #{interface}"
|
27
27
|
end
|
28
28
|
|
29
29
|
|
@@ -169,7 +169,7 @@ module SonyCameraRemoteAPI
|
|
169
169
|
def connect(ssid = nil)
|
170
170
|
entry = get(ssid)
|
171
171
|
if entry
|
172
|
-
Scripts.connect entry['
|
172
|
+
Scripts.connect entry['ssid'], entry['pass'], entry['interface']
|
173
173
|
else
|
174
174
|
false
|
175
175
|
end
|
@@ -183,7 +183,7 @@ module SonyCameraRemoteAPI
|
|
183
183
|
def reconnect(ssid = nil)
|
184
184
|
entry = get(ssid)
|
185
185
|
if entry
|
186
|
-
Scripts.restart_and_connect entry['
|
186
|
+
Scripts.restart_and_connect entry['ssid'], entry['pass'], entry['interface']
|
187
187
|
else
|
188
188
|
false
|
189
189
|
end
|
@@ -5,6 +5,7 @@ require 'sony_camera_remote_api/utils'
|
|
5
5
|
require 'sony_camera_remote_api/camera_api'
|
6
6
|
require 'sony_camera_remote_api/packet'
|
7
7
|
require 'sony_camera_remote_api/shelf'
|
8
|
+
require 'sony_camera_remote_api/retrying'
|
8
9
|
require 'core_ext/hash_patch'
|
9
10
|
require 'httpclient'
|
10
11
|
require 'active_support'
|
@@ -30,7 +31,7 @@ module SonyCameraRemoteAPI
|
|
30
31
|
|
31
32
|
attr_reader :endpoints
|
32
33
|
|
33
|
-
# Timeout for saving images captured by
|
34
|
+
# Timeout for saving images captured by continuous shooting.
|
34
35
|
CONT_SHOOT_SAVING_TIME = 25
|
35
36
|
# Timeout for focusing by tracking focus.
|
36
37
|
TRACKING_FOCUS_TIMEOUT = 4
|
@@ -57,8 +58,11 @@ module SonyCameraRemoteAPI
|
|
57
58
|
@reconnect_by = reconnect_by if reconnect_by
|
58
59
|
|
59
60
|
@api_manager = CameraAPIManager.new @endpoints, reconnect_by: @reconnect_by
|
60
|
-
@
|
61
|
-
@
|
61
|
+
@http = HTTPClient.new
|
62
|
+
@http.connect_timeout = @http.send_timeout = @http.receive_timeout = 10
|
63
|
+
@retrying = Retrying.new(@reconnect_by, @http).add_common_hook do
|
64
|
+
startRecMode! timeout: 0
|
65
|
+
end
|
62
66
|
|
63
67
|
# Some cameras which use "Smart Remote Control" app must call this method before remote shooting.
|
64
68
|
startRecMode! timeout: 0
|
@@ -498,7 +502,7 @@ module SonyCameraRemoteAPI
|
|
498
502
|
|
499
503
|
x = [[x, 100].min, 0].max
|
500
504
|
y = [[y, 100].min, 0].max
|
501
|
-
actTrackingFocus(['xPosition'
|
505
|
+
actTrackingFocus(['xPosition' => x, 'yPosition' => y]).result
|
502
506
|
begin
|
503
507
|
wait_event(timeout: TRACKING_FOCUS_TIMEOUT) { |r| r[54]['trackingFocusStatus'] == 'Tracking' }
|
504
508
|
log.info "Tracking focus (#{x}, #{y}) OK."
|
@@ -597,9 +601,9 @@ module SonyCameraRemoteAPI
|
|
597
601
|
# Break from loop inside when timeout
|
598
602
|
catch :finished do
|
599
603
|
# For reconnection
|
600
|
-
reconnect_and_retry_forever do
|
604
|
+
@retrying.reconnect_and_retry_forever do
|
601
605
|
# Retrieve streaming data
|
602
|
-
@
|
606
|
+
@http.get_content(liveview_url) do |chunk|
|
603
607
|
loop_start = Time.now
|
604
608
|
received_sec = loop_start - loop_end
|
605
609
|
|
@@ -658,6 +662,8 @@ module SonyCameraRemoteAPI
|
|
658
662
|
end
|
659
663
|
end
|
660
664
|
end
|
665
|
+
rescue StandardError => e
|
666
|
+
log.error e.backtrace.join "\n"
|
661
667
|
ensure
|
662
668
|
# Comes here when liveview finished or killed by signal
|
663
669
|
puts 'Stopping Liveview...'
|
@@ -813,13 +819,14 @@ module SonyCameraRemoteAPI
|
|
813
819
|
TRANSFER_SIZE_LIST = %w(original large small thumbnail).freeze
|
814
820
|
# Transfer content(s) from the camera storage.
|
815
821
|
# @note You have to set camera function to 'Contents Transfer' before calling this method.
|
816
|
-
# @param [Array<Hash>] contents
|
817
|
-
# @param [Array<String>] filenames
|
818
|
-
# @param [String] size
|
822
|
+
# @param [Array<Hash>] contents Array of content information, which can be obtained by get_content_list
|
823
|
+
# @param [Array<String>] filenames Array of filename strings
|
824
|
+
# @param [String, Array<String>] size Content size. available values are 'original', 'large', 'small', 'thumbnail'.
|
825
|
+
# @param [Boolean] add_postfix If +true+, postfix is appended for 'large', 'small' and 'thumbnail' content size.
|
819
826
|
# @see get_content_list
|
820
827
|
# @see get_date_list
|
821
828
|
# @todo If 'contents' is directory (date), get all contents of the directory.
|
822
|
-
def transfer_contents(contents, filenames=[], dir: nil, size: 'original')
|
829
|
+
def transfer_contents(contents, filenames=[], dir: nil, size: 'original', add_postfix: true)
|
823
830
|
contents = [contents].compact unless contents.is_a? Array
|
824
831
|
filenames = [filenames].compact unless filenames.is_a? Array
|
825
832
|
size = [size].compact unless size.is_a? Array
|
@@ -838,7 +845,7 @@ module SonyCameraRemoteAPI
|
|
838
845
|
end
|
839
846
|
end
|
840
847
|
|
841
|
-
urls_filenames = get_content_url(contents, filenames, size)
|
848
|
+
urls_filenames = get_content_url(contents, filenames, size, add_postfix: add_postfix)
|
842
849
|
if urls_filenames.empty?
|
843
850
|
log.warn 'No contents to be transferred.'
|
844
851
|
return []
|
@@ -889,9 +896,9 @@ module SonyCameraRemoteAPI
|
|
889
896
|
FileUtils.mkdir_p dir if dir
|
890
897
|
result = true
|
891
898
|
time = Benchmark.realtime do
|
892
|
-
result = reconnect_and_give_up do
|
899
|
+
result = @retrying.reconnect_and_give_up do
|
893
900
|
open(filepath, 'wb') do |file|
|
894
|
-
@
|
901
|
+
@http.get_content(url) do |chunk|
|
895
902
|
file.write chunk
|
896
903
|
end
|
897
904
|
end
|
@@ -936,7 +943,7 @@ module SonyCameraRemoteAPI
|
|
936
943
|
else
|
937
944
|
filenames = contents.map { |c| c['content']['original'][0]['fileName'] }
|
938
945
|
end
|
939
|
-
transferred = transfer_contents contents, filenames, size: transfer_size, dir: dir
|
946
|
+
transferred = transfer_contents contents, filenames, size: transfer_size, dir: dir, add_postfix: false
|
940
947
|
change_function_to_shoot 'still', 'Burst'
|
941
948
|
transferred
|
942
949
|
end
|
@@ -957,9 +964,9 @@ module SonyCameraRemoteAPI
|
|
957
964
|
contents = get_content_list type: 'still', sort: 'descending', count: num_shots
|
958
965
|
if prefix
|
959
966
|
filenames = generate_sequencial_filenames prefix, 'JPG', num: contents.size
|
960
|
-
transferred = transfer_contents contents, filenames, dir: dir
|
967
|
+
transferred = transfer_contents contents, filenames, dir: dir, add_postfix: false
|
961
968
|
else
|
962
|
-
transferred = transfer_contents contents, size: transfer_size, dir: dir
|
969
|
+
transferred = transfer_contents contents, size: transfer_size, dir: dir, add_postfix: false
|
963
970
|
end
|
964
971
|
change_function_to_shoot 'intervalstill'
|
965
972
|
transferred
|
@@ -1090,7 +1097,7 @@ module SonyCameraRemoteAPI
|
|
1090
1097
|
end
|
1091
1098
|
|
1092
1099
|
|
1093
|
-
def get_content_list_sub(source, type: nil, target: 'all', view
|
1100
|
+
def get_content_list_sub(source, type: nil, target: 'all', view: nil, sort: nil, count: nil)
|
1094
1101
|
max_count = getContentCount([{'uri' => source, 'type' => type, 'view' => view}]).result[0]['count']
|
1095
1102
|
count = count ? [max_count, count].min : max_count
|
1096
1103
|
contents = []
|
@@ -1113,9 +1120,9 @@ module SonyCameraRemoteAPI
|
|
1113
1120
|
log.debug url
|
1114
1121
|
log.info "Transferring #{filepath}..."
|
1115
1122
|
time = Benchmark.realtime do
|
1116
|
-
reconnect_and_retry(hook: method(:change_function_to_transfer)) do
|
1123
|
+
@retrying.reconnect_and_retry(hook: method(:change_function_to_transfer)) do
|
1117
1124
|
open(filepath, 'wb') do |file|
|
1118
|
-
@
|
1125
|
+
@http.get_content(url) do |chunk|
|
1119
1126
|
file.write chunk
|
1120
1127
|
end
|
1121
1128
|
end
|
@@ -1128,13 +1135,14 @@ module SonyCameraRemoteAPI
|
|
1128
1135
|
end
|
1129
1136
|
|
1130
1137
|
|
1131
|
-
def get_content_url(contents, filenames, sizes)
|
1138
|
+
def get_content_url(contents, filenames, sizes, add_postfix: true)
|
1132
1139
|
urls_filenames = []
|
1133
1140
|
contents.zip(filenames).product(sizes).map { |e| e.flatten }.each do |content, filename, size|
|
1134
1141
|
next unless content
|
1135
1142
|
|
1136
1143
|
filename ||= content['content']['original'][0]['fileName']
|
1137
1144
|
base = File.basename filename, '.*'
|
1145
|
+
postfix = add_postfix ? "_#{size}" : ''
|
1138
1146
|
case size
|
1139
1147
|
when 'original'
|
1140
1148
|
raise StandardError if content['content']['original'].size > 1 # FIXME: When do we come here???
|
@@ -1151,13 +1159,13 @@ module SonyCameraRemoteAPI
|
|
1151
1159
|
filename = "#{base}#{ext}"
|
1152
1160
|
when 'large'
|
1153
1161
|
url = content['content']['largeUrl']
|
1154
|
-
filename = "#{base}
|
1162
|
+
filename = "#{base}#{postfix}.JPG"
|
1155
1163
|
when 'small'
|
1156
1164
|
url = content['content']['smallUrl']
|
1157
|
-
filename = "#{base}
|
1165
|
+
filename = "#{base}#{postfix}.JPG"
|
1158
1166
|
when 'thumbnail'
|
1159
1167
|
url = content['content']['thumbnailUrl']
|
1160
|
-
filename = "#{base}
|
1168
|
+
filename = "#{base}#{postfix}.JPG"
|
1161
1169
|
end
|
1162
1170
|
if url.empty?
|
1163
1171
|
log.error "Skipping empty URL for file: #{filename}, size: #{size}"
|
@@ -1168,44 +1176,5 @@ module SonyCameraRemoteAPI
|
|
1168
1176
|
urls_filenames
|
1169
1177
|
end
|
1170
1178
|
|
1171
|
-
|
1172
|
-
# Try to run given block.
|
1173
|
-
# If an error raised because of the Wi-Fi disconnection, try to reconnect and run the block again.
|
1174
|
-
# If error still continues, give it up and raise the error.
|
1175
|
-
def reconnect_and_retry(retrying: true, num: 1, hook: nil)
|
1176
|
-
yield
|
1177
|
-
rescue HTTPClient::BadResponseError, HTTPClient::TimeoutError, Errno::EHOSTUNREACH, Errno::ECONNREFUSED => e
|
1178
|
-
retry_count ||= 0
|
1179
|
-
retry_count += 1
|
1180
|
-
raise e if @reconnect_by.nil? || retry_count > num
|
1181
|
-
log.error "#{e.class}: #{e.message}"
|
1182
|
-
log.error 'The camera seems to be disconnected! Reconnecting...'
|
1183
|
-
unless @reconnect_by.call
|
1184
|
-
log.error 'Failed to reconnect.'
|
1185
|
-
raise e
|
1186
|
-
end
|
1187
|
-
log.error 'Reconnected.'
|
1188
|
-
@cli.reset_all
|
1189
|
-
# For cameras that use Smart Remote Control app.
|
1190
|
-
startRecMode! timeout: 0
|
1191
|
-
|
1192
|
-
if hook
|
1193
|
-
unless hook.call
|
1194
|
-
log.error 'Before-retry hook failed.'
|
1195
|
-
raise e
|
1196
|
-
end
|
1197
|
-
end
|
1198
|
-
retry if retrying
|
1199
|
-
end
|
1200
|
-
|
1201
|
-
def reconnect_and_retry_forever(&block)
|
1202
|
-
reconnect_and_retry &block
|
1203
|
-
rescue HTTPClient::BadResponseError, HTTPClient::TimeoutError, Errno::EHOSTUNREACH, Errno::ECONNREFUSED => e
|
1204
|
-
retry
|
1205
|
-
end
|
1206
|
-
|
1207
|
-
def reconnect_and_give_up(&block)
|
1208
|
-
reconnect_and_retry(retrying: false, &block)
|
1209
|
-
end
|
1210
1179
|
end
|
1211
1180
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
set -u
|
3
|
+
export LANG="C"
|
4
|
+
|
5
|
+
function usage() {
|
6
|
+
cat <<EOT
|
7
|
+
Description:
|
8
|
+
*** For MacOS ***
|
9
|
+
Add a static route to the SSDP broadcast address via the specified interface.
|
10
|
+
If interface is not given, the internal Wi-Fi device is used.
|
11
|
+
Usage:
|
12
|
+
bash ${0##*/} <interface-name>
|
13
|
+
EOT
|
14
|
+
}
|
15
|
+
|
16
|
+
# Verify the number of arguments
|
17
|
+
if [ $# -gt 1 ]; then usage && exit 1; fi
|
18
|
+
|
19
|
+
if [ -z "${1+x}" ]; then
|
20
|
+
# Get the device name associated with Wi-Fi network service
|
21
|
+
WIFI_DEV_NAME=$(networksetup -listallhardwareports | grep -w Wi-Fi -A1 | awk '/^Device:/{ print $2 }')
|
22
|
+
if [ -z "${WIFI_DEV_NAME}" ]; then
|
23
|
+
echo "Internal Wi-Fi device not found!"
|
24
|
+
exit 2
|
25
|
+
fi
|
26
|
+
else
|
27
|
+
# Verify the specified interface exists
|
28
|
+
WIFI_DEV_NAME=$(networksetup -listallhardwareports | awk "/^Device: $1/{ print \$2 }")
|
29
|
+
if [ -z "${WIFI_DEV_NAME}" ]; then
|
30
|
+
echo "Specified interface not found!"
|
31
|
+
exit 2
|
32
|
+
fi
|
33
|
+
fi
|
34
|
+
|
35
|
+
# The broadcast address for SSDP discover
|
36
|
+
SSDP_ADDR=239.255.255.250
|
37
|
+
|
38
|
+
|
39
|
+
# Verify the existence of the route
|
40
|
+
route -n get ${SSDP_ADDR} | grep -q "interface: ${WIFI_DEV_NAME}"
|
41
|
+
if [ $? -eq 0 ]; then
|
42
|
+
echo 'Route already configured.'
|
43
|
+
exit 0
|
44
|
+
fi
|
45
|
+
|
46
|
+
# Add the route via the internal Wi-Fi device
|
47
|
+
route add -host ${SSDP_ADDR} -interface ${WIFI_DEV_NAME}
|
48
|
+
if [ $? -ne 0 ]; then
|
49
|
+
echo "Failed to add route to ${SSDP_ADDR} via ${WIFI_DEV_NAME}"
|
50
|
+
exit 1
|
51
|
+
fi
|
52
|
+
|
53
|
+
# Confirm the addition of the route completes
|
54
|
+
route -n get ${SSDP_ADDR} | grep -q "interface: ${WIFI_DEV_NAME}"
|
55
|
+
if [ $? -ne 0 ]; then
|
56
|
+
echo "Something goes wrong!"
|
57
|
+
exit 2
|
58
|
+
fi
|
59
|
+
|
60
|
+
echo 'Route added successfully.'
|
61
|
+
exit 0
|
@@ -0,0 +1,108 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
set -u
|
3
|
+
export LANG="C"
|
4
|
+
|
5
|
+
function usage() {
|
6
|
+
cat <<EOT
|
7
|
+
Description:
|
8
|
+
*** For Mac ***
|
9
|
+
Connect to the specified wireless network.
|
10
|
+
Cannot be used with a third-party Wi-Fi adapter.
|
11
|
+
Usage:
|
12
|
+
bash ${0##*/} <network-SSID> <password>
|
13
|
+
Option:
|
14
|
+
-r : restart interface even if already connected.
|
15
|
+
EOT
|
16
|
+
}
|
17
|
+
|
18
|
+
# Options
|
19
|
+
while getopts r OPT
|
20
|
+
do
|
21
|
+
case $OPT in
|
22
|
+
r) FLAG_RESTART=1
|
23
|
+
;;
|
24
|
+
\?) usage && exit 1
|
25
|
+
;;
|
26
|
+
esac
|
27
|
+
done
|
28
|
+
shift $((OPTIND - 1))
|
29
|
+
|
30
|
+
# Verify the number of arguments
|
31
|
+
if [ $# -ne 2 ]; then usage && exit 1; fi
|
32
|
+
|
33
|
+
# Get the device name associated with Wi-Fi network service
|
34
|
+
WIFI_DEV_NAME=$(networksetup -listallhardwareports | grep -w Wi-Fi -A1 | awk '/^Device:/{ print $2 }')
|
35
|
+
if [ -z "${WIFI_DEV_NAME}" ]; then
|
36
|
+
echo "Internal Wi-Fi device not found!"
|
37
|
+
exit 2
|
38
|
+
fi
|
39
|
+
|
40
|
+
# If --restart option is not given, exit if already connected.
|
41
|
+
if [ -z ${FLAG_RESTART+x} ]; then
|
42
|
+
networksetup -getairportnetwork ${WIFI_DEV_NAME} | grep -wq $1
|
43
|
+
if [ $? -eq 0 ]; then
|
44
|
+
echo 'Already connected.'
|
45
|
+
exit 0
|
46
|
+
fi
|
47
|
+
fi
|
48
|
+
|
49
|
+
# Power ON the interface if not.
|
50
|
+
POWER_ON_WAIT=1
|
51
|
+
networksetup -getairportpower ${WIFI_DEV_NAME} | grep -wiq 'off'
|
52
|
+
if [ $? -eq 0 ]; then
|
53
|
+
networksetup -setairportpower ${WIFI_DEV_NAME} on
|
54
|
+
if [ $? -ne 0 ]; then
|
55
|
+
echo "Failed to power on ${WIFI_DEV_NAME}."
|
56
|
+
exit 3
|
57
|
+
fi
|
58
|
+
sleep ${POWER_ON_WAIT}
|
59
|
+
fi
|
60
|
+
|
61
|
+
# Full path of airport command
|
62
|
+
AIRPORT_CMD='/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport'
|
63
|
+
|
64
|
+
# Scan networks with specified SSID
|
65
|
+
SCAN_RETRY=4
|
66
|
+
SCAN_INTERVAL=15
|
67
|
+
try=1
|
68
|
+
while true; do
|
69
|
+
${AIRPORT_CMD} --scan=$1 | grep -wq $1
|
70
|
+
if [ $? -eq 0 ]; then
|
71
|
+
break
|
72
|
+
elif [ ${try} -eq ${SCAN_RETRY} ]; then
|
73
|
+
echo "The wi-fi network with SSID '$1' not found."
|
74
|
+
exit 4
|
75
|
+
fi
|
76
|
+
((try++))
|
77
|
+
echo "Scan failed, retrying... (${try}/${SCAN_RETRY})"
|
78
|
+
sleep ${SCAN_INTERVAL}
|
79
|
+
done
|
80
|
+
|
81
|
+
# Try to connect
|
82
|
+
CONNECTION_RETRY=3
|
83
|
+
RETRY_INTERVAL=2
|
84
|
+
remain=${CONNECTION_RETRY}
|
85
|
+
while [ ${remain} -gt 0 ]
|
86
|
+
do
|
87
|
+
# Judge from the output because 'networksetup -setairportnetwork' returns always 0.
|
88
|
+
networksetup -setairportnetwork ${WIFI_DEV_NAME} $1 $2 | grep -wq 'Error'
|
89
|
+
if [ $? -ne 0 ]; then
|
90
|
+
break
|
91
|
+
fi
|
92
|
+
((remain--))
|
93
|
+
sleep ${RETRY_INTERVAL}
|
94
|
+
done
|
95
|
+
if [ ${remain} -eq 0 ]; then
|
96
|
+
echo "Failed to join the network. Password may be incorrect."
|
97
|
+
exit 5
|
98
|
+
fi
|
99
|
+
|
100
|
+
# Confirm the connection completes.
|
101
|
+
networksetup -getairportnetwork ${WIFI_DEV_NAME} | grep -wq $1
|
102
|
+
if [ $? -ne 0 ]; then
|
103
|
+
echo 'Something wrong occured!'
|
104
|
+
exit 6
|
105
|
+
fi
|
106
|
+
|
107
|
+
echo 'Connected successfully.'
|
108
|
+
exit 0
|
@@ -4,12 +4,16 @@ export LANG="C"
|
|
4
4
|
|
5
5
|
function usage() {
|
6
6
|
cat <<EOT
|
7
|
-
|
8
|
-
|
7
|
+
Description:
|
8
|
+
Connect to the specified wireless network.
|
9
|
+
Usage:
|
10
|
+
bash ${0##*/} [options] <network-SSID> <password> <interface-name>
|
11
|
+
Option:
|
12
|
+
-r : restart interface even if already connected.
|
9
13
|
EOT
|
10
14
|
}
|
11
15
|
|
12
|
-
#
|
16
|
+
# Options
|
13
17
|
while getopts r OPT
|
14
18
|
do
|
15
19
|
case $OPT in
|
@@ -21,46 +25,46 @@ do
|
|
21
25
|
done
|
22
26
|
shift $((OPTIND - 1))
|
23
27
|
|
24
|
-
#
|
28
|
+
# Verify the number of arguments
|
25
29
|
if [ $# -ne 3 ]; then usage && exit 1; fi
|
26
30
|
|
27
|
-
#
|
28
|
-
iwconfig $
|
31
|
+
# Verify the existence of specified interface
|
32
|
+
iwconfig $3 > /dev/null 2>&1
|
29
33
|
if [ $? -ne 0 ]; then
|
30
|
-
echo "
|
34
|
+
echo "Specified interface '$3' not found."
|
31
35
|
exit 2
|
32
36
|
fi
|
33
37
|
|
34
|
-
#
|
38
|
+
# If --restart option is not given, exit if already connected.
|
35
39
|
if [ -z ${FLAG_RESTART+x} ]; then
|
36
|
-
#
|
37
|
-
iwconfig $
|
40
|
+
# Exit if already connected
|
41
|
+
iwconfig $3 | grep -wq "ESSID:\"$1\"" && ifconfig $3 | grep -q 'inet addr'
|
38
42
|
if [ $? -eq 0 ]; then
|
39
43
|
echo "Already connected."
|
40
44
|
exit 0
|
41
45
|
fi
|
42
46
|
fi
|
43
47
|
|
44
|
-
#
|
48
|
+
# Restart the interface
|
45
49
|
POWER_ON_WAIT=1
|
46
|
-
ifconfig $
|
47
|
-
ifconfig $
|
50
|
+
ifconfig $3 down
|
51
|
+
ifconfig $3 up
|
48
52
|
if [ $? -ne 0 ]; then
|
49
|
-
echo "Failed to activate interface $
|
53
|
+
echo "Failed to activate interface '$3'"
|
50
54
|
exit 3
|
51
55
|
fi
|
52
56
|
sleep ${POWER_ON_WAIT}
|
53
57
|
|
54
|
-
#
|
58
|
+
# Scan networks with specified SSID
|
55
59
|
SCAN_RETRY=4
|
56
|
-
SCAN_INTERVAL=
|
60
|
+
SCAN_INTERVAL=15
|
57
61
|
try=1
|
58
62
|
while true; do
|
59
|
-
iwlist $
|
63
|
+
iwlist $3 scan | grep -wq "ESSID:\"$1\""
|
60
64
|
if [ $? -eq 0 ]; then
|
61
65
|
break
|
62
66
|
elif [ ${try} -eq ${SCAN_RETRY} ]; then
|
63
|
-
echo "The wi-fi network with SSID '$
|
67
|
+
echo "The wi-fi network with SSID '$1' not found."
|
64
68
|
exit 4
|
65
69
|
fi
|
66
70
|
((try++))
|
@@ -68,42 +72,43 @@ while true; do
|
|
68
72
|
sleep ${SCAN_INTERVAL}
|
69
73
|
done
|
70
74
|
|
71
|
-
# wpa_supplicant
|
72
|
-
pkill -f "wpa_supplicant.+-i *$
|
75
|
+
# Kill if wpa_supplicant is alive
|
76
|
+
pkill -f "wpa_supplicant.+-i *$3 .*"
|
73
77
|
|
74
|
-
# SSID
|
75
|
-
iwconfig $
|
78
|
+
# Set SSID for the interface
|
79
|
+
iwconfig $3 essid $1
|
76
80
|
|
77
|
-
#
|
78
|
-
WPA_AUTH_TIMEOUT=
|
81
|
+
# Try to connect
|
82
|
+
WPA_AUTH_TIMEOUT=30
|
79
83
|
is_connected=false
|
80
84
|
current_time=$(date +%s)
|
81
|
-
# wpa_supplicant
|
85
|
+
# Run wpa_supplicant by nohup. stdbuf is introduced to prevent buffering.
|
82
86
|
while read -t ${WPA_AUTH_TIMEOUT} line; do
|
83
87
|
echo " $line"
|
88
|
+
# Judge from the output log
|
84
89
|
echo $line | grep -wq 'CTRL-EVENT-CONNECTED'
|
85
90
|
if [ $? -eq 0 ]; then
|
86
91
|
is_connected=true
|
87
92
|
break
|
88
93
|
fi
|
89
|
-
#
|
94
|
+
# Is timeout?
|
90
95
|
if [ $(($(date +%s) - ${current_time})) -gt ${WPA_AUTH_TIMEOUT} ]; then
|
91
96
|
echo "Timeout."
|
92
97
|
break
|
93
98
|
fi
|
94
|
-
done < <(nohup bash -c "wpa_passphrase $
|
95
|
-
# done < <(nohup bash -c "wpa_passphrase $
|
99
|
+
done < <(nohup bash -c "wpa_passphrase $1 $2 | stdbuf -oL wpa_supplicant -B -i $3 -D wext -c /dev/stdin -f /dev/stdout")
|
100
|
+
# done < <(nohup bash -c "wpa_passphrase $1 $2 | stdbuf -oL wpa_supplicant -i $3 -D wext -c /dev/stdin 2>&1 | stdbuf -oL tee wpa.log &")
|
96
101
|
if ! $is_connected; then
|
97
102
|
echo 'WPA authentication failed.'
|
98
|
-
pkill -f "wpa_supplicant.+-i *$
|
103
|
+
pkill -f "wpa_supplicant.+-i *$3 .*"
|
99
104
|
exit 5
|
100
105
|
fi
|
101
106
|
|
102
|
-
# IP
|
103
|
-
ifconfig $
|
107
|
+
# Assign IP address by DHCP
|
108
|
+
ifconfig $3 | grep -q 'inet addr'
|
104
109
|
if [ $? -ne 0 ]; then
|
105
|
-
dhclient $
|
106
|
-
ifconfig $
|
110
|
+
dhclient $3
|
111
|
+
ifconfig $3 | grep -q 'inet addr'
|
107
112
|
if [ $? -ne 0 ]; then
|
108
113
|
echo 'IP address cannot not be assgined.'
|
109
114
|
exit 6
|
data/scripts/connect.sh
CHANGED
@@ -2,13 +2,13 @@
|
|
2
2
|
|
3
3
|
function usage() {
|
4
4
|
cat <<EOT
|
5
|
-
Usage: bash ${0##*/} <
|
5
|
+
Usage: bash ${0##*/} <network-SSID> <password> <interface-name>
|
6
6
|
EOT
|
7
7
|
}
|
8
8
|
|
9
9
|
CONNECT_OPTION=''
|
10
10
|
|
11
|
-
#
|
11
|
+
# Options
|
12
12
|
while getopts r OPT
|
13
13
|
do
|
14
14
|
case $OPT in
|
@@ -20,17 +20,22 @@ do
|
|
20
20
|
done
|
21
21
|
shift $((OPTIND - 1))
|
22
22
|
|
23
|
+
# Verify the number of arguments
|
23
24
|
if [ $# -ne 3 ]; then usage && exit 1; fi
|
24
25
|
|
25
26
|
cd $(dirname $0)
|
26
|
-
|
27
|
-
case "${
|
28
|
-
'Linux'
|
29
|
-
bash ./${
|
27
|
+
sysname=$(uname)
|
28
|
+
case "${sysname}" in
|
29
|
+
'Linux')
|
30
|
+
bash ./${sysname}/connect_wifi.sh ${CONNECT_OPTION} $1 $2 $3 && bash ./${sysname}/add_ssdp_route.sh $3
|
31
|
+
exit $?
|
32
|
+
;;
|
33
|
+
'Darwin')
|
34
|
+
bash ./${sysname}/connect_wifi.sh ${CONNECT_OPTION} $1 $2 && bash ./${sysname}/add_ssdp_route.sh
|
30
35
|
exit $?
|
31
36
|
;;
|
32
37
|
* )
|
33
|
-
echo "The
|
38
|
+
echo "The system '${sysname}' is not supported!"
|
34
39
|
exit 1
|
35
40
|
;;
|
36
41
|
esac
|
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_development_dependency "rspec", "~> 3.5"
|
28
28
|
spec.add_development_dependency "simplecov"
|
29
29
|
|
30
|
-
spec.add_dependency "activesupport"
|
30
|
+
spec.add_dependency "activesupport", ">= 4.0.0"
|
31
31
|
spec.add_dependency "frisky"
|
32
32
|
spec.add_dependency "httpclient"
|
33
33
|
spec.add_dependency "nokogiri"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sony_camera_remote_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kota65535
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-10-
|
11
|
+
date: 2016-10-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: 4.0.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:
|
82
|
+
version: 4.0.0
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: frisky
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -195,11 +195,14 @@ files:
|
|
195
195
|
- lib/sony_camera_remote_api/logging.rb
|
196
196
|
- lib/sony_camera_remote_api/packet.rb
|
197
197
|
- lib/sony_camera_remote_api/raw_api.rb
|
198
|
+
- lib/sony_camera_remote_api/retrying.rb
|
198
199
|
- lib/sony_camera_remote_api/scripts.rb
|
199
200
|
- lib/sony_camera_remote_api/shelf.rb
|
200
201
|
- lib/sony_camera_remote_api/ssdp.rb
|
201
202
|
- lib/sony_camera_remote_api/utils.rb
|
202
203
|
- lib/sony_camera_remote_api/version.rb
|
204
|
+
- scripts/Darwin/add_ssdp_route.sh
|
205
|
+
- scripts/Darwin/connect_wifi.sh
|
203
206
|
- scripts/Linux/add_ssdp_route.sh
|
204
207
|
- scripts/Linux/connect_wifi.sh
|
205
208
|
- scripts/connect.sh
|