cantemo-portal-agent 1.0.9

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.
@@ -0,0 +1,183 @@
1
+ require 'envoi/mam/agent/transfer_client/aspera'
2
+ require 'envoi/mam/agent/transfer_client/s3'
3
+
4
+ require 'ubiquity/vdms/uplynk/api/client'
5
+
6
+ module Envoi
7
+
8
+ module Mam
9
+
10
+ class Vdms
11
+
12
+ class Agent < Envoi::Mam::Agent
13
+
14
+ DEFAULT_FORMAT_NAME = 'ORIGINAL'
15
+ DEFAULT_DESTINATION_PATH = '.'
16
+
17
+ def after_initialize
18
+ @default_format_name = initial_args[:default_format_name] || DEFAULT_FORMAT_NAME
19
+ end
20
+
21
+ def iconik_config
22
+ config['vdms']
23
+ end
24
+
25
+ def initialize_api_client(args = { })
26
+ @api_client = args[:api_client] || begin
27
+ http_host_address = iconik_config['http_host_address']
28
+ application_id = iconik_config['application_id']
29
+ token = iconik_config['token']
30
+ client_args = { }
31
+ client_args[:http_host_address] = http_host_address if http_host_address && !http_host_address.empty?
32
+ client_args[:application_id] = application_id if application_id && !application_id.empty?
33
+ client_args[:token] = token if token && !token.empty?
34
+ Ubiquity::Iconik::API::Utilities.new(client_args)
35
+ end
36
+ end
37
+
38
+ def download(args = { })
39
+
40
+ asset_id = args[:asset_id]
41
+ file_id = args[:file_id]
42
+ if file_id && !file_id.empty?
43
+ asset_file = api_client.asset_file_get(asset_id: asset_id, file_id: file_id)
44
+ else
45
+ format_name = args[:format_name] || @default_format_name
46
+ format = api_client.asset_format_get_by_name(asset_id: asset_id, format_name: format_name.upcase)
47
+ format_id = format['id']
48
+
49
+ asset_files_get_response = api_client.asset_files_get(asset_id: asset_id, generate_signed_url: true)
50
+ asset_files = asset_files_get_response['objects']
51
+
52
+ asset_files_for_format = asset_files.find_all { |f| f['format_id'] == format_id }
53
+
54
+ asset_file = asset_files_for_format.first
55
+ end
56
+
57
+ # file = files.first
58
+ files = [ asset_file ] # just do the first file for now
59
+ files.each do |file|
60
+ begin
61
+ download_file(args, file)
62
+ rescue => e
63
+ logger.warn { "Exception: #{$!}. #{$@.first}" }
64
+ end
65
+ end
66
+ logger.info { 'DONE' }
67
+ end
68
+
69
+ def download_file(args, file)
70
+ logger.debug { "File: #{file}"}
71
+ transfer_type = args[:transfer_type] || ''
72
+
73
+ file_storage_id = file['storage_id']
74
+ file_directory_path = file['directory_path']
75
+ file_path = !file_directory_path || file_directory_path.empty? ? file['original_name'] : File.join(file_directory_path, file['original_name'])
76
+
77
+ file_storage_config = iconik_config['storages'][file_storage_id]
78
+
79
+ unless file_storage_config && !file_storage_config.empty?
80
+ raise Exception, "No configuration found for storage '#{file_storage_id}'"
81
+ end
82
+
83
+ logger.info { "Transferring File Path: '#{file_path}'" }
84
+ preserve_path = args.fetch(:preserve_path, file_storage_config.fetch('preserve_path', true))
85
+
86
+ destination_path = args[:destination_path] || file_storage_config['destination_path'] || DEFAULT_DESTINATION_PATH
87
+ relative_path = preserve_path ? file_directory_path : nil
88
+ relative_path = nil if relative_path == '.'
89
+
90
+ target_path = relative_path ? File.join(destination_path, relative_path) : destination_path
91
+ target_path = target_path[0..-1] if target_path.start_with?('/') && !destination_path.start_with?('/')
92
+
93
+ aspera_config = file_storage_config['aspera']
94
+ if (transfer_type.empty? || transfer_type == :aspera) && (aspera_config && !aspera_config.empty?)
95
+ client = Envoi::Mam::Agent::TransferClient::Aspera.new(agent: self)
96
+ return client.download(aspera_config, file_path, target_path)
97
+ end
98
+
99
+ s3_config = file_storage_config['s3']
100
+ if (transfer_type.empty? || transfer_type == :s3) && (s3_config && !s3_config.empty?)
101
+ target_path = File.expand_path(target_path) if target_path == '.'
102
+ target_path = File.join(target_path, File.basename(file_path))
103
+ client = Envoi::Mam::Agent::TransferClient::S3.new(agent: self)
104
+ return client.download(s3_config, file_path, target_path)
105
+ end
106
+
107
+ logger.warn { "No Supported TransferClient Configuration#{transfer_type && !transfer_type.empty? ? " for transfer type '#{transfer_type}' " : ''}Found in Storage Configuration." }
108
+ end
109
+
110
+ def upload(args = { })
111
+ file_path = args[:file_path]
112
+ if File.directory?(file_path)
113
+ file_paths = Dir.glob(File.join(file_path, '*.*'))
114
+ logger.debug { "File Paths: #{file_paths}"}
115
+ file_paths.map { |fp| upload(args.merge(file_path: fp))}
116
+ return file_paths
117
+ end
118
+ logger.debug { "Preparing to upload '#{file_path}'" }
119
+
120
+ transfer_type = args[:transfer_type] || ''
121
+ storage_id = args[:storage_id]
122
+ path_on_storage = nil
123
+ iconik_storage_config = iconik_config['storages'][storage_id]
124
+
125
+ unless iconik_storage_config && !iconik_storage_config.empty?
126
+ raise Exception, "No configuration found for storage '#{storage_id}'"
127
+ end
128
+
129
+ preserve_path = args.fetch(:preserve_path, iconik_storage_config.fetch('preserve_path', true))
130
+
131
+ destination_path = args[:destination_path] || iconik_storage_config['destination_path'] || '/'
132
+ relative_path = preserve_path ? File.dirname(file_path) : nil
133
+ relative_path = File.expand_path(relative_path) if relative_path == '.'
134
+
135
+ target_path = relative_path ? File.join(destination_path, relative_path) : destination_path
136
+ target_path = target_path[1..-1] if target_path.start_with?('/') && !destination_path.start_with?('/')
137
+
138
+ # abort("FP: #{file_path} TP: #{target_path}")
139
+
140
+ transfer_response = begin
141
+ aspera_config = iconik_storage_config['aspera']
142
+ if (transfer_type.empty? || transfer_type == :aspera) && (aspera_config && !aspera_config.empty?)
143
+ client = Envoi::Mam::Agent::TransferClient::Aspera.new(agent: self)
144
+ resp = client.upload(aspera_config, file_path, target_path)
145
+ end
146
+
147
+ s3_config = iconik_storage_config['s3']
148
+ if (!resp) && (transfer_type.empty? || transfer_type == :s3) && (s3_config && !s3_config.empty?)
149
+ _target_path = target_path
150
+ _target_path = '' if target_path == '.'
151
+ _target_path = File.join(_target_path, File.basename(file_path))
152
+ client = Envoi::Mam::Agent::TransferClient::S3.new(agent: self)
153
+ resp = client.upload(s3_config, file_path, _target_path)
154
+ path_on_storage = _target_path
155
+ end
156
+
157
+ resp
158
+ end
159
+
160
+ if transfer_response.nil?
161
+ logger.warn { "No supported TransferClient configuration#{transfer_type && !transfer_type.empty? ? " for transfer type '#{transfer_type}' " : ''}found in storage configuration." }
162
+ return false
163
+ end
164
+
165
+ unless transfer_response
166
+ logger.warn { ""}
167
+ return false
168
+ end
169
+
170
+ file_size = File.exist?(file_path) ? File.size?(file_path) : 1024
171
+ path_on_storage ||= File.join(target_path, File.basename(file_path))
172
+
173
+ api_client.asset_add_using_file_path(file_path: path_on_storage, storage_id: storage_id, file_size: file_size)
174
+ end
175
+
176
+
177
+ end
178
+
179
+ end
180
+
181
+ end
182
+
183
+ end
@@ -0,0 +1,214 @@
1
+ require 'envoi/mam/agent/transfer_client/aspera'
2
+ require 'envoi/mam/agent/transfer_client/s3'
3
+
4
+ require 'vidispine/api/utilities'
5
+
6
+ module Envoi
7
+
8
+ module Mam
9
+
10
+ class Vidispine
11
+
12
+ class Agent < Envoi::Mam::Agent
13
+
14
+ DEFAULT_SHAPE_TAG = 'original'
15
+ DEFAULT_ASPERA_ARGS = '-v -k3 --overwrite=diff -P 33001'
16
+ DEFAULT_DESTINATION_PATH = '.'
17
+
18
+ attr_accessor :default_aspera_ascp_args,
19
+ :default_aspera_ascp_path,
20
+ :default_vidispine_shape_tag
21
+
22
+ def after_initialize
23
+ args = initial_args
24
+ @default_aspera_ascp_path = args[:default_aspera_ascp_path]
25
+ @default_aspera_args = args[:default_ascp_args] || DEFAULT_ASPERA_ARGS
26
+ end
27
+
28
+ def dry_run?; @dry_run end
29
+
30
+ def vidispine_config
31
+ config['vidispine'] || { }
32
+ end
33
+
34
+ def initialize_api_client(args = { })
35
+ _vidispine_config = vidispine_config
36
+ @api_client = args[:vidispine_api_client] || begin
37
+
38
+ vidispine_host = _vidispine_config['host']
39
+ vidispine_username = _vidispine_config['username']
40
+ vidispine_password = _vidispine_config['password']
41
+ client_args = { }
42
+ client_args[:http_host_address] = vidispine_host if vidispine_host
43
+ client_args[:username] = vidispine_username if vidispine_username
44
+ client_args[:password] = vidispine_password if vidispine_password
45
+ ::Vidispine::API::Utilities.new(client_args)
46
+ end
47
+
48
+ @default_vidispine_shape_tag = args[:default_shape_tag] || _vidispine_config['default_shape_tag'] || _vidispine_config['shape_tag'] || DEFAULT_SHAPE_TAG
49
+
50
+ end
51
+
52
+ def item_get_shape_by_tag(item_id, shape_tag)
53
+ item_shapes_get_response = api_client.item_shapes_get(:item_id => item_id, :tag => shape_tag)
54
+ shape_id = item_shapes_get_response['uri'].first
55
+ end
56
+
57
+ def download(args = { })
58
+
59
+ item_id = args[:item_id]
60
+ shape_id = args[:shape_id]
61
+ unless shape_id && !shape_id.empty?
62
+ shape_tag = args[:shape_tag] || default_vidispine_shape_tag
63
+ shape_id = item_get_shape_by_tag(item_id, shape_tag)
64
+ end
65
+
66
+ logger.info { "Getting file path for Item ID: #{item_id} Shape ID: #{shape_id}"}
67
+ item_shape_get_response = api_client.item_shape_get(:item_id => item_id, :shape_id => shape_id)
68
+
69
+ files = item_shape_get_response['containerComponent']['file']
70
+ logger.debug { "Files: #{files}"}
71
+
72
+ # file = files.first
73
+ files = [ files.first ] # just do the first file for now
74
+ files.each do |file|
75
+ begin
76
+ download_file(args, file)
77
+ rescue => e
78
+ logger.warn { "Exception: #{$!}" }
79
+ end
80
+ end
81
+ logger.info { 'DONE' }
82
+ end
83
+
84
+ def download_file(args, file)
85
+ logger.debug { "File: #{file}"}
86
+ transfer_type = args[:transfer_type]
87
+
88
+ file_storage_id = file['storage']
89
+ file_path = file['path']
90
+
91
+ file_storage_config = vidispine_config['storages'][file_storage_id]
92
+
93
+ unless file_storage_config && !file_storage_config.empty?
94
+ raise Exception, "No configuration found for storage '#{file_storage_id}'"
95
+ end
96
+
97
+ logger.info { "Transferring File Path: '#{file_path}'" }
98
+ preserve_path = args.fetch(:preserve_path, file_storage_config.fetch('preserve_path', true))
99
+
100
+ destination_path = args[:destination_path] || file_storage_config['destination_path'] || DEFAULT_DESTINATION_PATH
101
+ relative_path = preserve_path ? File.dirname(file_path) : nil
102
+ relative_path = nil if relative_path == '.'
103
+
104
+ target_path = relative_path ? File.join(destination_path, relative_path) : destination_path
105
+ target_path = target_path[0..-1] if target_path.start_with?('/') && !destination_path.start_with?('/')
106
+
107
+ aspera_config = file_storage_config['aspera']
108
+ if (transfer_type.empty? || transfer_type == :aspera) && (aspera_config && !aspera_config.empty?)
109
+ client = Envoi::Mam::Agent::TransferClient::Aspera.new(agent: self)
110
+ return client.download(aspera_config, file_path, target_path)
111
+ # download_using_aspera(aspera_config, file_path, target_path)
112
+ end
113
+
114
+ s3_config = file_storage_config['s3']
115
+ if (transfer_type.empty? || transfer_type == :s3) && (s3_config && !s3_config.empty?)
116
+ target_path = File.expand_path(target_path) if target_path == '.'
117
+ target_path = File.join(target_path, File.basename(file_path))
118
+ client = Envoi::Mam::Agent::TransferClient::S3.new(agent: self)
119
+ return client.download(s3_config, file_path, target_path)
120
+ end
121
+
122
+ logger.warn { "No Supported TransferClient Configuration#{transfer_type && !transfer_type.empty? ? " for transfer type '#{transfer_type}' " : ''}Found in Storage Configuration." }
123
+ end
124
+
125
+ def upload(args = { })
126
+ file_path = args[:file_path]
127
+ raise ArgumentError, "Path not found: '#{file_path}'" unless File.exists?(file_path)
128
+
129
+ if File.directory?(file_path)
130
+ # Non-recursive directory upload
131
+ file_paths = Dir.glob(File.join(file_path, '*.*'))
132
+ logger.debug { "File Paths: #{file_paths}"}
133
+ file_paths.map { |fp| upload(args.merge(file_path: fp))}
134
+ return file_paths
135
+ end
136
+ logger.debug { "Preparing to upload '#{file_path}'" }
137
+
138
+ transfer_type = args[:transfer_type] || ''
139
+ storage_id = args[:storage_id]
140
+ vidispine_storage_config = vidispine_config['storages'][storage_id]
141
+
142
+ unless vidispine_storage_config && !vidispine_storage_config.empty?
143
+ raise "No configuration found for storage '#{storage_id}'"
144
+ end
145
+
146
+ should_import_file = args.fetch(:import_file, vidispine_storage_config.fetch('import', true))
147
+
148
+ should_preserve_path = args.fetch(:preserve_path, vidispine_storage_config.fetch('preserve_path', true))
149
+
150
+ destination_path = args[:destination_path] || vidispine_storage_config['destination_path'] || '/'
151
+ relative_path = should_preserve_path ? File.dirname(file_path) : nil
152
+ relative_path = File.expand_path(relative_path) if relative_path == '.'
153
+
154
+ target_path = relative_path ? File.join(destination_path, relative_path) : destination_path
155
+ target_path = target_path[0..-1] if target_path.start_with?('/') && !destination_path.start_with?('/')
156
+
157
+
158
+ # upload file
159
+
160
+ transfer_response = begin
161
+ aspera_config = vidispine_storage_config['aspera']
162
+ if (transfer_type.empty? || transfer_type == :aspera) && (aspera_config && !aspera_config.empty?)
163
+ client = Envoi::Mam::Agent::TransferClient::Aspera.new(agent: self)
164
+ response = client.upload(aspera_config, file_path, target_path)
165
+ end
166
+
167
+ s3_config = vidispine_storage_config['s3']
168
+ if !response && (transfer_type.empty? || transfer_type == :s3) && (s3_config && !s3_config.empty?)
169
+ _target_path = target_path
170
+ _target_path = File.expand_path(_target_path) if target_path == '.'
171
+ _target_path = File.join(_target_path, File.basename(file_path))
172
+ client = Envoi::Mam::Agent::TransferClient::S3.new(agent: self)
173
+ response = client.upload(s3_config, file_path, _target_path)
174
+ end
175
+
176
+ response
177
+ end
178
+
179
+ logger.warn { "No supported TransferClient configuration#{transfer_type && !transfer_type.empty? ? " for transfer type '#{transfer_type}' " : ''}found in storage configuration." } unless transfer_response != nil
180
+
181
+ _response = { transfer_response: transfer_response }
182
+
183
+ return _response unless should_import_file
184
+
185
+ item_id = args[:item_id]
186
+ shape_tag = args[:shape_tag] || default_vidispine_shape_tag
187
+
188
+ # attach file to item as shape
189
+ path_on_storage = File.join(target_path, File.basename(file_path))
190
+ file_create_response = api_client.storage_file_create storage_id: storage_id, path: path_on_storage, state: 'CLOSED'
191
+ file_id = file_create_response['id']
192
+
193
+ if item_id
194
+ item_shape_import_response = vs_api.item_shape_import item_id: item_id, tag: shape_tag, fileId: file_id
195
+ else
196
+ item_shape_import_response = vs_api.item_add_using_file_path storage_id: storage_id,
197
+ file_path: file_path,
198
+ file_id: file_id,
199
+ storage_path_map: { '/' => storage_id }
200
+ end
201
+ _response[:import_response] = item_shape_import_response
202
+
203
+ _response
204
+ end
205
+
206
+ # Agent
207
+ end
208
+
209
+ # Vidispine
210
+ end
211
+
212
+ end
213
+
214
+ end
@@ -0,0 +1,117 @@
1
+ module Envoi
2
+
3
+ module Mam
4
+
5
+ class Wiredrive
6
+
7
+ class Agent < Envoi::Mam::Agent
8
+
9
+ def after_initialize
10
+
11
+ end
12
+
13
+ def initialize_api_client(args = {})
14
+ @api_client = args[:api_client] || begin
15
+ client_args = {}
16
+ Ubiquity::Wiredrive::API::V3::Client.new(client_args)
17
+ end
18
+ end
19
+
20
+ def download(args = {})
21
+
22
+ presentation_invitation_token = args[:presentation_invitation_token]
23
+ if presentation_invitation_token
24
+ presentation_password = args[:presentation_password]
25
+ r = api_client.presentation_get_using_token(presentation_invitation_token, presentation_password)
26
+
27
+ end
28
+
29
+ end
30
+
31
+ # Downloads a file from a URI or file location and saves it to a local path
32
+ #
33
+ # @param [String] download_file_path The source path of the file being downloaded
34
+ # @param [String] destination_file_path The destination path for the file being downloaded
35
+ # @param [Boolean] overwrite Determines if the destination file will be overwritten if it is found to exist
36
+ #
37
+ # @return [Hash]
38
+ # * :download_file_path [String] The source path of the file being downloaded
39
+ # * :overwrite [Boolean] The value of the overwrite parameter when the method was called
40
+ # * :file_downloaded [Boolean] Indicates if the file was downloaded, will be false if overwrite was true and the file existed
41
+ # * :destination_file_existed [String|Boolean] The value will be 'unknown' if overwrite is true because the file exist check will not have been run inside of the method
42
+ # * :destination_file_path [String] The destination path for the file being downloaded
43
+ def download_file(download_file_path, destination_file_path, overwrite = false)
44
+ logger.debug { "Downloading '#{download_file_path}' -> '#{destination_file_path}' Overwrite: #{overwrite}" }
45
+ file_existed = 'unknown'
46
+ if overwrite or not (file_existed = File.exists?(destination_file_path))
47
+ File.open(destination_file_path, 'wb') { |tf|
48
+ open(download_file_path) { |sf| tf.write sf.read }
49
+ }
50
+ file_downloaded = true
51
+ else
52
+ file_downloaded = false
53
+ end
54
+ { :download_file_path => download_file_path, :overwrite => overwrite, :file_downloaded => file_downloaded, :destination_file_existed => file_existed, :destination_file_path => destination_file_path }
55
+ end
56
+
57
+
58
+ def presentation_assets_download(args = {}, options = {})
59
+ assets = args[:assets]
60
+ destination_path = args[:destination_path]
61
+ assets.each { |a| presentation_asset_download(a, destination_path, options) }
62
+ end
63
+
64
+ def presentation_asset_download(asset, destination_path, options = {})
65
+ destination_dir = destination_path
66
+ overwrite = options.fetch(:overwrite, false)
67
+
68
+ media_elements = asset['media']
69
+ # media_elements.concat asset['thumbnails']
70
+ media_elements.each do |media|
71
+ url = media['downloadUrl'] || media['url']
72
+ uri = URI(url)
73
+ file_name = CGI.unescape(File.basename(uri.path))
74
+ destination_file_path = File.join(destination_dir, file_name)
75
+ download_file(url, destination_file_path, overwrite)
76
+ end
77
+
78
+ thumbnails = asset['thumbnails']
79
+ thumbnails.each do |media|
80
+ url = media['downloadUrl'] || media['url']
81
+ uri = URI(url)
82
+ file_name = CGI.unescape(File.basename(uri.path)) + "_thumbnail_#{media['category']}.#{media['extension']}"
83
+ destination_file_path = File.join(destination_dir, file_name)
84
+ download_file(url, destination_file_path, overwrite)
85
+ end
86
+
87
+ end
88
+
89
+ # @param [Object] presentation_invitation_token
90
+ # @param [Object] presentation_password
91
+ # @param [Object] options
92
+ # @option options [Boolean] :preserve_auth_token Determines if the api clients auth token is reset to the
93
+ # value it was before retrieving the presentation
94
+ # @return [Object]
95
+ def presentation_get_using_token(presentation_invitation_token, presentation_password = nil, options = {})
96
+ preserve_auth_token = options.fetch(:preserve_auth_token, true)
97
+ auth_token = api_client.presentation_authorize_get(token: presentation_invitation_token, password: presentation_password)
98
+ presentation_id = api_client.response['presentation']['id']
99
+ original_auth_token = api_client.auth_token
100
+ api_client.auth_token = auth_token
101
+ presentation = api_client.presentation_get(:id => presentation_id)
102
+ api_client.auth_token = original_auth_token if preserve_auth_token
103
+ presentation
104
+ end
105
+
106
+
107
+ def upload(args = {})
108
+ raise 'Upload method is not implemented.'
109
+ end
110
+
111
+ end
112
+
113
+ end
114
+
115
+ end
116
+
117
+ end