OSDN Git Service

da532bf771a216e265b30978ed52037ef9d637d1
[pettanr/pettanr.git] / bin / panel_import.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 src_host src_auth dest_host dest_auth"\r
11   puts "upload on child dirs"\r
12   exit\r
13 end\r
14 \r
15 src_host = ARGV[0]\r
16 src_auth = ARGV[1]\r
17 dest_host = ARGV[2]\r
18 dest_auth = ARGV[3]\r
19 \r
20 class Importer\r
21   def initialize src_host, src_auth, dest_host, dest_auth\r
22     @src_host = src_host\r
23     @src_auth = src_auth\r
24     @dest_host = dest_host\r
25     @dest_auth = dest_auth\r
26     @src_licenses = {}\r
27     self.licenses(@src_host).each do |l|\r
28       @src_licenses[l['id'].to_i] = l\r
29     end\r
30     @dest_licenses = {}\r
31     self.licenses(@dest_host).each do |l|\r
32       @dest_licenses[l['name']] = l\r
33     end\r
34     @src_speech_balloon_templates = {}\r
35     self.speech_balloon_templates(@src_host, @src_auth).each do |sb|\r
36       @src_speech_balloon_templates[sb['id'].to_i] = sb\r
37     end\r
38     @dest_speech_balloon_templates = {}\r
39     self.speech_balloon_templates(@dest_host, @dest_auth).each do |sb|\r
40       @dest_speech_balloon_templates[sb['name']] = sb\r
41     end\r
42     @src_writing_formats = {}\r
43     self.writing_formats(          @dest_host, @dest_auth).each do |wf|\r
44   #  self.writing_formats(@src_host, @src_auth).each do |wf|\r
45       @src_writing_formats[wf['id'].to_i] = wf\r
46     end\r
47     @dest_writing_formats = {}\r
48     self.writing_formats(@dest_host, @dest_auth).each do |wf|\r
49       @dest_writing_formats[wf['name']] = wf\r
50     end\r
51     @src_system_pictures = {}\r
52     self.system_pictures(@src_host, @src_auth).each do |sp|\r
53       @src_system_pictures[sp['id'].to_i] = sp\r
54     end\r
55     @dest_system_pictures = {}\r
56     self.system_pictures(@dest_host, @dest_auth).each do |sp|\r
57       @dest_system_pictures[sp['md5']] = sp\r
58     end\r
59   end\r
60   \r
61   def licenses host\r
62     res = {}\r
63     u = host + 'licenses.json'\r
64     r = RestClient.get(u, :params => {:page_size  => 100})\r
65     JSON.parse r\r
66   end\r
67   \r
68   def license_groups host\r
69     res = {}\r
70     u = host + 'license_groups.json'\r
71     r = RestClient.get(u, :params => {:page_size  => 100})\r
72     ary = JSON.parse r\r
73     ary.each do |l|\r
74       res[l['id'].to_i] = l\r
75     end\r
76     res\r
77   end\r
78   \r
79   def speech_balloon_templates host, auth\r
80     res = {}\r
81     u = host + 'speech_balloon_templates.json'\r
82     r = RestClient.get(u, :params => {:page_size  => 100, :auth_token => auth})\r
83     JSON.parse r\r
84   end\r
85   \r
86   def writing_formats host, auth\r
87     res = {}\r
88     u = host + 'writing_formats.json'\r
89     r = RestClient.get(u, :params => {:page_size  => 100, :auth_token => auth})\r
90     JSON.parse r\r
91   end\r
92   \r
93   def system_pictures host, auth\r
94     res = {}\r
95     u = host + 'system_pictures.json'\r
96     r = RestClient.get(u, :params => {:page_size  => 100, :auth_token => auth})\r
97     JSON.parse r\r
98   end\r
99   \r
100   def panels host, auth\r
101     res = {}\r
102     u = host + 'home/panels.json'\r
103     r = RestClient.get(u, :params => {:page_size  => 100, :auth_token => auth})\r
104     ary = JSON.parse r\r
105     ary.each do |panel|\r
106       res[panel['id'].to_i] = panel\r
107     end\r
108     res\r
109   end\r
110   \r
111   def resource_picture md5, host, auth\r
112     res = {}\r
113     u = host + 'pictures/search.json'\r
114     r = RestClient.get(u, :params => {:md5 => md5, :auth_token => auth})\r
115     JSON.parse r\r
116   end\r
117   \r
118   def each_panel\r
119     self.panels(@src_host, @src_auth).each do |key, panel_json|\r
120       puts 'source panel:' + key.to_s\r
121       # 今はAPIの仕様が変わっているので、そのうち書き直す\r
122       elements = panel_json['elements']\r
123       panel_json.delete 'elements'\r
124       c = true\r
125       elements.each do |e|\r
126         if e['link']\r
127           element_name = 'panel_pictures'\r
128           puts 'pp:' + e['id'].to_s\r
129           rps = self.resource_picture e['picture']['md5'], @dest_host, @dest_auth\r
130           if rps.any?\r
131             rp = rps.first\r
132             puts 'picture ok(' + rp['id'].to_s + ')'\r
133           else\r
134             puts 'no picture'\r
135             c = false\r
136             break\r
137           end\r
138           src_ls_name = @src_licenses[e['picture']['license_id']]['name'].gsub /License\:/, 'Licenses:'\r
139           puts 'license:' + e['picture']['license_id'].to_s + '(' + src_ls_name + ')'\r
140           if dl = @dest_licenses[src_ls_name]\r
141             puts 'license ok(' + dl['id'].to_s + ')'\r
142           else\r
143             puts 'no license'\r
144             c = false\r
145             break\r
146           end\r
147           e['picture_id'] = rp['id']\r
148           e.delete 'picture'\r
149           e.delete 'license'\r
150         elsif e['classname']\r
151           element_name = 'speech_balloons'\r
152           puts 'sb:' + e['id'].to_s\r
153           src_sb_name = @src_speech_balloon_templates[e['speech_balloon_template_id']]['name']\r
154           puts 'speech_balloon_template:' + e['speech_balloon_template_id'].to_s + '(' + src_sb_name + ')'\r
155           if dsb = @dest_speech_balloon_templates[src_sb_name]\r
156             puts 'speech_balloon_template ok(' + dsb['id'].to_s + ')'\r
157           else\r
158             puts 'no speech_balloon_template'\r
159             c = false\r
160             break\r
161           end\r
162           src_sp_md5 = @src_system_pictures[e['balloon']['system_picture_id']]['md5']\r
163           puts 'balloon picture:' + e['balloon']['system_picture_id'].to_s + '(' + src_sp_md5 + ')'\r
164           if dsp = @dest_system_pictures[src_sp_md5]\r
165             puts 'balloon picture ok(' + dsp['id'].to_s + ')'\r
166           else\r
167             puts 'no balloon picture'\r
168             c = false\r
169             break\r
170           end\r
171           src_wf_name = @src_writing_formats[e['speech']['writing_format_id']]['name']\r
172           puts 'speech writing_format:' + e['speech']['writing_format_id'].to_s + '(' + src_wf_name + ')'\r
173           if dwf = @dest_writing_formats[src_wf_name]\r
174             puts 'speech writing_format ok(' + dwf['id'].to_s + ')'\r
175           else\r
176             puts 'no speech writing_format'\r
177             c = false\r
178             break\r
179           end\r
180           e['speech_balloon_template_id'] = dsb['id']\r
181           e["speech_balloon_template_settings"] = e["settings"]\r
182           e.delete 'settings'\r
183           e["speech_balloon_template_classname"] = dsb["classname"]\r
184           e.delete 'classname'\r
185           #e.delete 'speech_balloon_template'\r
186           balloon = e['balloon']\r
187           e.delete 'balloon'\r
188           balloon.delete 'id'\r
189           balloon.delete 'speech_balloon_id'\r
190           balloon["speech_balloon_template_settings"] = e["settings"]\r
191           balloon.delete 'settings'\r
192           balloon['system_picture_id'] = dsp['id']\r
193           balloon['speech_balloon_template_id'] = dsb['id']\r
194           balloon["speech_balloon_template_classname"] = dsb["classname"]\r
195           \r
196           speech = e['speech']\r
197           e.delete 'speech'\r
198           speech.delete 'id'\r
199           speech.delete 'speech_balloon_id'\r
200           speech["speech_balloon_template_settings"] = e["settings"]\r
201           speech.delete 'settings'\r
202           speech['speech_balloon_template_id'] = dsb['id']\r
203           speech["speech_balloon_template_classname"] = dsb["classname"]\r
204           speech['writing_format_id'] = dwf['id']\r
205     #      speech["writing_format_classname"] = 'Pettanr' + dwf["classname"]\r
206           speech["writing_format_classname"] = dwf["classname"]\r
207           \r
208           e['balloon_attributes'] = balloon\r
209           e['speech_attributes'] = speech\r
210         elsif e['code']\r
211           element_name = 'ground_colors'\r
212           puts 'gc:' + e['id'].to_s\r
213         elsif e['repeat']\r
214           element_name = 'ground_pictures'\r
215           puts 'gp:' + e['id'].to_s\r
216           rps = self.resource_picture e['picture']['md5'], @dest_host, @dest_auth\r
217           if rps.any?\r
218             rp = rps.first\r
219             puts 'picture ok(' + rp['id'].to_s + ')'\r
220           else\r
221             puts 'no picture'\r
222             c = false\r
223             break\r
224           end\r
225           #e['license_id'] = dl['id']\r
226           e['picture_id'] = rp['id']\r
227           #e.delete 'license'\r
228         else\r
229           c = false\r
230           break\r
231         end\r
232         eid = e['id']\r
233         e.delete 'id'\r
234         e.delete 'panel_id'\r
235         panel_json[element_name + '_attributes'] ||= {}\r
236         panel_json[element_name + '_attributes']['new' + eid.to_s] = e\r
237       end\r
238       next unless c\r
239       puts '============ importable'\r
240       panel_json.delete 'id'\r
241       panel_json.delete 'author'\r
242       panel_json.delete 'author_id'\r
243       panel_json.delete "created_at"\r
244       panel_json.delete 'updated_at'\r
245       yield panel_json\r
246     end\r
247   end\r
248   \r
249   def each_opset \r
250     self.each_subdir do |filename|\r
251       imgfile = nil\r
252       lsname = nil\r
253       formname = nil\r
254       attr  = nil\r
255       Dir.glob(filename + '/*') do |fn|\r
256         ext = File.extname(fn).downcase\r
257         case ext\r
258         when '.json'\r
259           json = JSON.parse(File.open(fn).read)\r
260           lsname = json["license_name"]\r
261           formname = json["formname"]\r
262           attr = json["attributes"]\r
263         when '.png', '.gif', '.jpeg'\r
264           imgfile = fn\r
265         end\r
266       end\r
267       if imgfile and lsname and formname and attr\r
268         yield imgfile, lsname, formname, attr\r
269       end\r
270     end\r
271   end\r
272   \r
273   def upload fn\r
274     oid = nil\r
275     b = Base64.encode64(File.open(fn, 'rb').read)\r
276     u = @host + 'original_pictures'\r
277     begin\r
278       r = RestClient.post(u, \r
279         {:original_picture => {:file  => b}, :auth_token => @auth}.to_json, \r
280         :content_type => :json, :accept => :json\r
281       )\r
282       o = JSON.parse r\r
283       oid = o['id']\r
284     rescue\r
285       puts ' failed: ' + r.to_s\r
286     end\r
287     oid\r
288   end\r
289   \r
290   def publish oid, lgid, rp\r
291     res = nil\r
292     u = @host + 'resource_pictures'\r
293     attr = {\r
294       :original_picture_id => oid, \r
295       :original_picture_license_group => {\r
296         :original_picture_id => oid, :license_group_id => lgid\r
297       }, \r
298       :resource_picture => {\r
299         :original_picture_id => oid, \r
300         :license_id => rp['license_id'], \r
301         :artist_name => rp['artist_name'], \r
302         :system_picture_id => rp['system_picture_id'], \r
303         :license_group_classname => rp['license_group_classname'], \r
304         :license_group_settings => rp['license_group_settings'], \r
305         :credit_picture_settings => rp['credit_picture_settings'], \r
306         :license_settings => rp['license_settings']\r
307       }, \r
308       :auth_token => @auth \r
309     }\r
310     begin\r
311       r = RestClient.post(u, \r
312         attr.to_json,\r
313         :content_type => :json, :accept => :json\r
314       )\r
315       res = JSON.parse r\r
316     rescue\r
317       puts ' failed: ' + r.to_s\r
318     end\r
319     res\r
320   end\r
321   \r
322   def publish_all\r
323     each_opset do |imgfile, lsname, formname, attr|\r
324       puts 'uploading: ' + imgfile\r
325       oid = self.upload imgfile\r
326       next unless oid\r
327       puts 'success: ' + oid.to_s\r
328       ls = @licenses[lsname]\r
329       unless ls\r
330         puts 'not detect licenses: ' + lsname.to_s\r
331         next\r
332       end\r
333       lsid = ls['id']\r
334       lgid = ls['license_group_id'].to_i\r
335       lg = @license_groups[lgid]\r
336       en = lg['classname']\r
337       puts 'building: ' + formname\r
338       rp = self.resource_picture oid, lgid, lsid, en, formname, attr\r
339       next unless rp\r
340       puts 'publishing: ' + lsname\r
341       r = self.publish oid, lgid, rp\r
342       puts 'success: ' + r['id'].to_s\r
343     end\r
344   end\r
345   \r
346 end\r
347 \r
348 u = Importer.new src_host, src_auth, dest_host, dest_auth\r
349 \r
350 u.each_panel do |panel_json|\r
351     u = dest_host + 'panels'\r
352  File.open('/Sites/panel_create.json', 'w') do |f|\r
353    f.write JSON.pretty_generate(panel_json)\r
354  end\r
355     begin\r
356       r = RestClient.post(u, \r
357         {:json => panel_json, :auth_token => dest_auth}.to_json, \r
358         :content_type => :json, :accept => :json\r
359       )\r
360       res = JSON.parse r\r
361     rescue\r
362       puts ' failed: ' + r.to_s\r
363     end\r
364    # break\r
365 end\r
366 \r
367 \r