--- /dev/null
+#サポートツール\r
+require 'rubygems'\r
+require 'active_support/all'\r
+require 'rest_client'\r
+require 'yaml'\r
+require 'json'\r
+require 'base64'\r
+\r
+if ARGV.size < 1\r
+ puts "uploader.rb src_host src_auth dest_host dest_auth"\r
+ puts "upload on child dirs"\r
+ exit\r
+end\r
+\r
+src_host = ARGV[0]\r
+src_auth = ARGV[1]\r
+dest_host = ARGV[2]\r
+dest_auth = ARGV[3]\r
+\r
+class Importer\r
+ def initialize src_host, src_auth, dest_host, dest_auth\r
+ @src_host = src_host\r
+ @src_auth = src_auth\r
+ @dest_host = dest_host\r
+ @dest_auth = dest_auth\r
+ @src_licenses = {}\r
+ self.licenses(@src_host).each do |l|\r
+ @src_licenses[l['id'].to_i] = l\r
+ end\r
+ @dest_licenses = {}\r
+ self.licenses(@dest_host).each do |l|\r
+ @dest_licenses[l['name']] = l\r
+ end\r
+ @src_speech_balloon_templates = {}\r
+ self.speech_balloon_templates(@src_host, @src_auth).each do |sb|\r
+ @src_speech_balloon_templates[sb['id'].to_i] = sb\r
+ end\r
+ @dest_speech_balloon_templates = {}\r
+ self.speech_balloon_templates(@dest_host, @dest_auth).each do |sb|\r
+ @dest_speech_balloon_templates[sb['name']] = sb\r
+ end\r
+ @src_writing_formats = {}\r
+ self.writing_formats( @dest_host, @dest_auth).each do |wf|\r
+ # self.writing_formats(@src_host, @src_auth).each do |wf|\r
+ @src_writing_formats[wf['id'].to_i] = wf\r
+ end\r
+ @dest_writing_formats = {}\r
+ self.writing_formats(@dest_host, @dest_auth).each do |wf|\r
+ @dest_writing_formats[wf['name']] = wf\r
+ end\r
+ @src_system_pictures = {}\r
+ self.system_pictures(@src_host, @src_auth).each do |sp|\r
+ @src_system_pictures[sp['id'].to_i] = sp\r
+ end\r
+ @dest_system_pictures = {}\r
+ self.system_pictures(@dest_host, @dest_auth).each do |sp|\r
+ @dest_system_pictures[sp['md5']] = sp\r
+ end\r
+ end\r
+ \r
+ def licenses host\r
+ res = {}\r
+ u = host + 'licenses.json'\r
+ r = RestClient.get(u, :params => {:page_size => 100})\r
+ JSON.parse r\r
+ end\r
+ \r
+ def license_groups host\r
+ res = {}\r
+ u = host + 'license_groups.json'\r
+ r = RestClient.get(u, :params => {:page_size => 100})\r
+ ary = JSON.parse r\r
+ ary.each do |l|\r
+ res[l['id'].to_i] = l\r
+ end\r
+ res\r
+ end\r
+ \r
+ def speech_balloon_templates host, auth\r
+ res = {}\r
+ u = host + 'speech_balloon_templates.json'\r
+ r = RestClient.get(u, :params => {:page_size => 100, :auth_token => auth})\r
+ JSON.parse r\r
+ end\r
+ \r
+ def writing_formats host, auth\r
+ res = {}\r
+ u = host + 'writing_formats.json'\r
+ r = RestClient.get(u, :params => {:page_size => 100, :auth_token => auth})\r
+ JSON.parse r\r
+ end\r
+ \r
+ def system_pictures host, auth\r
+ res = {}\r
+ u = host + 'system_pictures.json'\r
+ r = RestClient.get(u, :params => {:page_size => 100, :auth_token => auth})\r
+ JSON.parse r\r
+ end\r
+ \r
+ def panels host, auth\r
+ res = {}\r
+ u = host + 'home/panels.json'\r
+ r = RestClient.get(u, :params => {:page_size => 100, :auth_token => auth})\r
+ ary = JSON.parse r\r
+ ary.each do |panel|\r
+ res[panel['id'].to_i] = panel\r
+ end\r
+ res\r
+ end\r
+ \r
+ def resource_picture md5, host, auth\r
+ res = {}\r
+ u = host + 'pictures/search.json'\r
+ r = RestClient.get(u, :params => {:md5 => md5, :auth_token => auth})\r
+ JSON.parse r\r
+ end\r
+ \r
+ def each_panel\r
+ self.panels(@src_host, @src_auth).each do |key, panel_json|\r
+ puts 'source panel:' + key.to_s\r
+ # 今はAPIの仕様が変わっているので、そのうち書き直す\r
+ elements = panel_json['elements']\r
+ panel_json.delete 'elements'\r
+ c = true\r
+ elements.each do |e|\r
+ if e['link']\r
+ element_name = 'panel_pictures'\r
+ puts 'pp:' + e['id'].to_s\r
+ rps = self.resource_picture e['picture']['md5'], @dest_host, @dest_auth\r
+ if rps.any?\r
+ rp = rps.first\r
+ puts 'picture ok(' + rp['id'].to_s + ')'\r
+ else\r
+ puts 'no picture'\r
+ c = false\r
+ break\r
+ end\r
+ src_ls_name = @src_licenses[e['picture']['license_id']]['name'].gsub /License\:/, 'Licenses:'\r
+ puts 'license:' + e['picture']['license_id'].to_s + '(' + src_ls_name + ')'\r
+ if dl = @dest_licenses[src_ls_name]\r
+ puts 'license ok(' + dl['id'].to_s + ')'\r
+ else\r
+ puts 'no license'\r
+ c = false\r
+ break\r
+ end\r
+ e['picture_id'] = rp['id']\r
+ e.delete 'picture'\r
+ e.delete 'license'\r
+ elsif e['classname']\r
+ element_name = 'speech_balloons'\r
+ puts 'sb:' + e['id'].to_s\r
+ src_sb_name = @src_speech_balloon_templates[e['speech_balloon_template_id']]['name']\r
+ puts 'speech_balloon_template:' + e['speech_balloon_template_id'].to_s + '(' + src_sb_name + ')'\r
+ if dsb = @dest_speech_balloon_templates[src_sb_name]\r
+ puts 'speech_balloon_template ok(' + dsb['id'].to_s + ')'\r
+ else\r
+ puts 'no speech_balloon_template'\r
+ c = false\r
+ break\r
+ end\r
+ src_sp_md5 = @src_system_pictures[e['balloon']['system_picture_id']]['md5']\r
+ puts 'balloon picture:' + e['balloon']['system_picture_id'].to_s + '(' + src_sp_md5 + ')'\r
+ if dsp = @dest_system_pictures[src_sp_md5]\r
+ puts 'balloon picture ok(' + dsp['id'].to_s + ')'\r
+ else\r
+ puts 'no balloon picture'\r
+ c = false\r
+ break\r
+ end\r
+ src_wf_name = @src_writing_formats[e['speech']['writing_format_id']]['name']\r
+ puts 'speech writing_format:' + e['speech']['writing_format_id'].to_s + '(' + src_wf_name + ')'\r
+ if dwf = @dest_writing_formats[src_wf_name]\r
+ puts 'speech writing_format ok(' + dwf['id'].to_s + ')'\r
+ else\r
+ puts 'no speech writing_format'\r
+ c = false\r
+ break\r
+ end\r
+ e['speech_balloon_template_id'] = dsb['id']\r
+ e["speech_balloon_template_settings"] = e["settings"]\r
+ e.delete 'settings'\r
+ e["speech_balloon_template_classname"] = dsb["classname"]\r
+ e.delete 'classname'\r
+ #e.delete 'speech_balloon_template'\r
+ balloon = e['balloon']\r
+ e.delete 'balloon'\r
+ balloon.delete 'id'\r
+ balloon.delete 'speech_balloon_id'\r
+ balloon["speech_balloon_template_settings"] = e["settings"]\r
+ balloon.delete 'settings'\r
+ balloon['system_picture_id'] = dsp['id']\r
+ balloon['speech_balloon_template_id'] = dsb['id']\r
+ balloon["speech_balloon_template_classname"] = dsb["classname"]\r
+ \r
+ speech = e['speech']\r
+ e.delete 'speech'\r
+ speech.delete 'id'\r
+ speech.delete 'speech_balloon_id'\r
+ speech["speech_balloon_template_settings"] = e["settings"]\r
+ speech.delete 'settings'\r
+ speech['speech_balloon_template_id'] = dsb['id']\r
+ speech["speech_balloon_template_classname"] = dsb["classname"]\r
+ speech['writing_format_id'] = dwf['id']\r
+ # speech["writing_format_classname"] = 'Pettanr' + dwf["classname"]\r
+ speech["writing_format_classname"] = dwf["classname"]\r
+ \r
+ e['balloon_attributes'] = balloon\r
+ e['speech_attributes'] = speech\r
+ elsif e['code']\r
+ element_name = 'ground_colors'\r
+ puts 'gc:' + e['id'].to_s\r
+ elsif e['repeat']\r
+ element_name = 'ground_pictures'\r
+ puts 'gp:' + e['id'].to_s\r
+ rps = self.resource_picture e['picture']['md5'], @dest_host, @dest_auth\r
+ if rps.any?\r
+ rp = rps.first\r
+ puts 'picture ok(' + rp['id'].to_s + ')'\r
+ else\r
+ puts 'no picture'\r
+ c = false\r
+ break\r
+ end\r
+ #e['license_id'] = dl['id']\r
+ e['picture_id'] = rp['id']\r
+ #e.delete 'license'\r
+ else\r
+ c = false\r
+ break\r
+ end\r
+ eid = e['id']\r
+ e.delete 'id'\r
+ e.delete 'panel_id'\r
+ panel_json[element_name + '_attributes'] ||= {}\r
+ panel_json[element_name + '_attributes']['new' + eid.to_s] = e\r
+ end\r
+ next unless c\r
+ puts '============ importable'\r
+ panel_json.delete 'id'\r
+ panel_json.delete 'author'\r
+ panel_json.delete 'author_id'\r
+ panel_json.delete "created_at"\r
+ panel_json.delete 'updated_at'\r
+ yield panel_json\r
+ end\r
+ end\r
+ \r
+ def each_opset \r
+ self.each_subdir do |filename|\r
+ imgfile = nil\r
+ lsname = nil\r
+ formname = nil\r
+ attr = nil\r
+ Dir.glob(filename + '/*') do |fn|\r
+ ext = File.extname(fn).downcase\r
+ case ext\r
+ when '.json'\r
+ json = JSON.parse(File.open(fn).read)\r
+ lsname = json["license_name"]\r
+ formname = json["formname"]\r
+ attr = json["attributes"]\r
+ when '.png', '.gif', '.jpeg'\r
+ imgfile = fn\r
+ end\r
+ end\r
+ if imgfile and lsname and formname and attr\r
+ yield imgfile, lsname, formname, attr\r
+ end\r
+ end\r
+ end\r
+ \r
+ def upload fn\r
+ oid = nil\r
+ b = Base64.encode64(File.open(fn, 'rb').read)\r
+ u = @host + 'original_pictures'\r
+ begin\r
+ r = RestClient.post(u, \r
+ {:original_picture => {:file => b}, :auth_token => @auth}.to_json, \r
+ :content_type => :json, :accept => :json\r
+ )\r
+ o = JSON.parse r\r
+ oid = o['id']\r
+ rescue\r
+ puts ' failed: ' + r.to_s\r
+ end\r
+ oid\r
+ end\r
+ \r
+ def publish oid, lgid, rp\r
+ res = nil\r
+ u = @host + 'resource_pictures'\r
+ attr = {\r
+ :original_picture_id => oid, \r
+ :original_picture_license_group => {\r
+ :original_picture_id => oid, :license_group_id => lgid\r
+ }, \r
+ :resource_picture => {\r
+ :original_picture_id => oid, \r
+ :license_id => rp['license_id'], \r
+ :artist_name => rp['artist_name'], \r
+ :system_picture_id => rp['system_picture_id'], \r
+ :license_group_classname => rp['license_group_classname'], \r
+ :license_group_settings => rp['license_group_settings'], \r
+ :credit_picture_settings => rp['credit_picture_settings'], \r
+ :license_settings => rp['license_settings']\r
+ }, \r
+ :auth_token => @auth \r
+ }\r
+ begin\r
+ r = RestClient.post(u, \r
+ attr.to_json,\r
+ :content_type => :json, :accept => :json\r
+ )\r
+ res = JSON.parse r\r
+ rescue\r
+ puts ' failed: ' + r.to_s\r
+ end\r
+ res\r
+ end\r
+ \r
+ def publish_all\r
+ each_opset do |imgfile, lsname, formname, attr|\r
+ puts 'uploading: ' + imgfile\r
+ oid = self.upload imgfile\r
+ next unless oid\r
+ puts 'success: ' + oid.to_s\r
+ ls = @licenses[lsname]\r
+ unless ls\r
+ puts 'not detect licenses: ' + lsname.to_s\r
+ next\r
+ end\r
+ lsid = ls['id']\r
+ lgid = ls['license_group_id'].to_i\r
+ lg = @license_groups[lgid]\r
+ en = lg['classname']\r
+ puts 'building: ' + formname\r
+ rp = self.resource_picture oid, lgid, lsid, en, formname, attr\r
+ next unless rp\r
+ puts 'publishing: ' + lsname\r
+ r = self.publish oid, lgid, rp\r
+ puts 'success: ' + r['id'].to_s\r
+ end\r
+ end\r
+ \r
+end\r
+\r
+u = Importer.new src_host, src_auth, dest_host, dest_auth\r
+\r
+u.each_panel do |panel_json|\r
+ u = dest_host + 'panels'\r
+ File.open('/Sites/panel_create.json', 'w') do |f|\r
+ f.write JSON.pretty_generate(panel_json)\r
+ end\r
+ begin\r
+ r = RestClient.post(u, \r
+ {:json => panel_json, :auth_token => dest_auth}.to_json, \r
+ :content_type => :json, :accept => :json\r
+ )\r
+ res = JSON.parse r\r
+ rescue\r
+ puts ' failed: ' + r.to_s\r
+ end\r
+ # break\r
+end\r
+\r
+\r