OSDN Git Service

Merge branch 'v05' of git.sourceforge.jp:/gitroot/pettanr/pettanr into v05
[pettanr/pettanr.git] / script / uploader.rb
1 #サポートツール\r
2 require 'rubygems'\r
3 require 'active_support/all'\r
4 require 'rest_client'\r
5 require 'yaml'\r
6 require 'json'\r
7 require 'base64'\r
8 \r
9 if ARGV.size < 1\r
10   puts "uploader.rb host dirname auth"\r
11   puts "upload on child dirs"\r
12   exit\r
13 end\r
14 \r
15 host = ARGV[0]\r
16 dirname = ARGV[1]\r
17 auth = ARGV[2]\r
18 \r
19 class Uploader\r
20   def initialize host, dirname, auth\r
21     @host = host\r
22     @dirname = dirname\r
23     @auth = auth\r
24     @licenses = self.licenses\r
25     @license_groups = self.license_groups\r
26   end\r
27   \r
28   def licenses\r
29     res = {}\r
30     u = @host + 'licenses.json'\r
31     r = RestClient.get(u)\r
32     ary = JSON.parse r\r
33     ary.each do |l|\r
34       res[l['name']] = l\r
35     end\r
36     res\r
37   end\r
38 \r
39   def license_groups\r
40     res = {}\r
41     u = @host + 'license_groups.json'\r
42     r = RestClient.get(u)\r
43     ary = JSON.parse r\r
44     ary.each do |l|\r
45       res[l['id'].to_i] = l\r
46     end\r
47     res\r
48   end\r
49   \r
50   def each_subdir\r
51     Dir.glob File.expand_path(@dirname) + '/*' do |filename|\r
52       if File.directory?(filename)\r
53         yield filename\r
54       end\r
55     end\r
56   end\r
57   \r
58   def each_opset \r
59     self.each_subdir do |filename|\r
60       imgfile = nil\r
61       lsname = nil\r
62       formname = nil\r
63       attr  = nil\r
64       Dir.glob(filename + '/*') do |fn|\r
65         ext = File.extname(fn).downcase\r
66         case ext\r
67         when '.json'\r
68           json = JSON.parse(File.open(fn).read)\r
69           lsname = json["license_name"]\r
70           formname = json["formname"]\r
71           attr = json["attributes"]\r
72         when '.png', '.gif', '.jpeg'\r
73           imgfile = fn\r
74         end\r
75       end\r
76       if imgfile and lsname and formname and attr\r
77         yield imgfile, lsname, formname, attr\r
78       end\r
79     end\r
80   end\r
81   \r
82   def upload fn\r
83     oid = nil\r
84     b = Base64.encode64(File.open(fn, 'rb').read)\r
85     u = @host + 'original_pictures'\r
86     begin\r
87       r = RestClient.post(u, \r
88         {:original_picture => {:file  => b}, :auth_token => @auth}.to_json, \r
89         :content_type => :json, :accept => :json\r
90       )\r
91       o = JSON.parse r\r
92       oid = o['id']\r
93     rescue\r
94       puts ' failed: ' + r.to_s\r
95     end\r
96     oid\r
97   end\r
98   \r
99   def resource_picture oid, lgid, lsid, en, formname, attr\r
100     rp = nil\r
101     u = @host + en.tableize + '/attributes'\r
102     attr['license_id'] = lsid\r
103     param = {\r
104       :original_picture_id => oid, \r
105       :original_picture_license_group => {\r
106         :original_picture_id => oid, :license_group_id => lgid\r
107       }, \r
108       :auth_token => @auth \r
109     }\r
110     param[formname] = attr\r
111     begin\r
112       r = RestClient.post(u, \r
113         param.to_json,\r
114         :content_type => :json, :accept => :json\r
115       )\r
116       rp = JSON.parse r\r
117     rescue\r
118       puts ' failed: ' + u.to_s\r
119       puts param\r
120       puts r.to_s\r
121     end\r
122     rp\r
123   end\r
124   \r
125   def publish oid, lgid, rp\r
126     res = nil\r
127     u = @host + 'resource_pictures'\r
128     attr = {\r
129       :original_picture_id => oid, \r
130       :original_picture_license_group => {\r
131         :original_picture_id => oid, :license_group_id => lgid\r
132       }, \r
133       :resource_picture => {\r
134         :original_picture_id => oid, \r
135         :license_id => rp['license_id'], \r
136         :artist_name => rp['artist_name'], \r
137         :classname => rp['classname'], \r
138         :credit => rp['credit'], \r
139         :settings => rp['settings']\r
140       }, \r
141       :auth_token => @auth \r
142     }\r
143     begin\r
144       r = RestClient.post(u, \r
145         attr.to_json,\r
146         :content_type => :json, :accept => :json\r
147       )\r
148       res = JSON.parse r\r
149     rescue\r
150       puts ' failed: ' + r.to_s\r
151     end\r
152     res\r
153   end\r
154   \r
155   def publish_all\r
156     each_opset do |imgfile, lsname, formname, attr|\r
157       puts 'uploading: ' + imgfile\r
158       oid = self.upload imgfile\r
159       next unless oid\r
160       puts 'success: ' + oid.to_s\r
161       ls = @licenses[lsname]\r
162       unless ls\r
163         puts 'not detect licenses: ' + lsname.to_s\r
164         next\r
165       end\r
166       lsid = ls['id']\r
167       lgid = ls['license_group_id'].to_i\r
168       lg = @license_groups[lgid]\r
169       en = lg['classname']\r
170       puts 'building: ' + formname\r
171       rp = self.resource_picture oid, lgid, lsid, en, formname, attr\r
172       next unless rp\r
173       puts 'publishing: ' + lsname\r
174       r = self.publish oid, lgid, rp\r
175       puts 'success: ' + r['id'].to_s\r
176     end\r
177   end\r
178   \r
179 end\r
180 \r
181 u = Uploader.new host, dirname, auth\r
182 \r
183 u.publish_all\r
184 \r