-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsony_ci
executable file
·105 lines (89 loc) · 3.17 KB
/
sony_ci
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!/usr/bin/env ruby -W0
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'sony_ci_api', github: 'WGBH-MLA/sony_ci_api_rewrite', branch: 'move_assets'
gem 'thor'
gem 'pry-byebug'
end
require 'sony_ci_api'
class SonyCiCli < Thor
MEDIA_FILE_EXTENSIONS = ['.mp3', '.mp4']
desc "move_media_assets <src> <dest>", "Move Audio and Video Assets from <src> folder to <dest> folder."
def move_media_assets(src, dest=nil)
src_folder = client.find_by_name(src, kind: 'folder')
dest_folder = client.find_by_name(dest, kind: 'folder')
raise "No folder named \"#{src}\" found" unless src_folder
raise "No folder named \"#{dest}\" found" unless dest_folder
filtered_tree = folder_filter(src_folder) do |item|
item['kind'] == 'Asset' && item['name'].end_with?(*MEDIA_FILE_EXTENSIONS)
end
media_assets = folder_flatten(filtered_tree)
if media_assets.count > 0
puts "Moving #{media_assets.count} media assets to folder \"#{dest_folder['name']}\"\n"
print_folder_tree(filtered_tree)
# media_asset_ids = media_assets.map { |media_asset| media_asset['id'] }
# client.move_assets(media_asset_ids, dest_folder['id'])
else
puts "No media assets found in folder \"#{src_folder['name']}\""
end
end
desc "folder_tree <folder_name>", "Recursively print a folders contents"
def folder_tree(folder_name)
folder = client.find_by_name(folder_name, kind: 'folder')
raise "No folder named \"#{folder_name}\" found" unless folder
print_folder_tree(folder)
end
no_commands do
def client
@client ||= SonyCiApi::Client.new('./ci.yml')
end
# Prints folder name and contents like a directory tree
def print_folder_tree(folder, depth: 0)
puts "#{' ' * depth}#{folder['name']}/"
# Fetch folder contents if not already fetched
folder['contents'] ||= client.folder_contents(folder['id'])
folder.fetch('contents', []).each do |item|
if item['kind'].downcase == 'folder'
print_folder_tree(item, depth: depth + 1)
else
puts "#{' ' * (depth + 1)}#{item['name']}"
end
end
end
def folder_filter(folder, &block)
# Fetch folder contents if not already fetched. This should only need to be done
# on the initial call, as folder_contents will recursively populate the 'contents'
# of all child folders.
all_folder_contents ||= client.folder_contents(folder['id'])
folder['contents'] = all_folder_contents.select! do |item|
yield(item) ||
(
item['kind'] == 'folder' &&
folder_filter(item, &block).count > 0
)
end
folder
end
# Returns a nested folder contents as a flat array, removing the folders and leaving
# only assets.
def folder_flatten(folder)
folder['contents'] ||= client.folder_contents(folder['id'])
folder['contents'].map do |item|
if item['kind'].downcase == 'folder'
folder_flatten(item)
else
item
end
end.flatten
end
end
end
if __FILE__ == $PROGRAM_NAME
begin
SonyCiCli.start(ARGV)
rescue => e
puts "ERROR: " + e.message
puts e.backtrace
end
end