pindo 4.6.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +7 -0
  2. data/bin/pindo +35 -0
  3. data/lib/pindo/base/aeshelper.rb +31 -0
  4. data/lib/pindo/base/deviceinfo.rb +90 -0
  5. data/lib/pindo/base/executable.rb +224 -0
  6. data/lib/pindo/base/githelper.rb +489 -0
  7. data/lib/pindo/base/hashhelper.rb +134 -0
  8. data/lib/pindo/base/plaininformative.rb +15 -0
  9. data/lib/pindo/base/plistbuddyexecutable.rb +121 -0
  10. data/lib/pindo/base/standarderror.rb +14 -0
  11. data/lib/pindo/client/applovinclient.rb +156 -0
  12. data/lib/pindo/client/aws3sclient.rb +183 -0
  13. data/lib/pindo/client/bossclient.rb +229 -0
  14. data/lib/pindo/client/bossconfigclient.rb +175 -0
  15. data/lib/pindo/client/giteeclient.rb +65 -0
  16. data/lib/pindo/client/httpclient.rb +40 -0
  17. data/lib/pindo/client/pgyerclient.rb +439 -0
  18. data/lib/pindo/client/tgateclient.rb +103 -0
  19. data/lib/pindo/command.rb +101 -0
  20. data/lib/pindo/config/pindoconfig.rb +439 -0
  21. data/lib/pindo/config/pindouserlocalconfig.rb +81 -0
  22. data/lib/pindo/deploy/Fastfile +233 -0
  23. data/lib/pindo/deploy/build.rb +167 -0
  24. data/lib/pindo/deploy/bundleid.rb +245 -0
  25. data/lib/pindo/deploy/cert.rb +508 -0
  26. data/lib/pindo/deploy/check.rb +79 -0
  27. data/lib/pindo/deploy/configproj.rb +89 -0
  28. data/lib/pindo/deploy/confusecode.rb +248 -0
  29. data/lib/pindo/deploy/confuseproj.rb +112 -0
  30. data/lib/pindo/deploy/fabric.rb +58 -0
  31. data/lib/pindo/deploy/getitcinfo.rb +248 -0
  32. data/lib/pindo/deploy/iap.rb +796 -0
  33. data/lib/pindo/deploy/initconfig.rb +128 -0
  34. data/lib/pindo/deploy/itcapp.rb +147 -0
  35. data/lib/pindo/deploy/itcinfo.rb +369 -0
  36. data/lib/pindo/deploy/pem.rb +55 -0
  37. data/lib/pindo/deploy/pullconfig.rb +46 -0
  38. data/lib/pindo/deploy/pushconfig.rb +83 -0
  39. data/lib/pindo/deploy/quswark.rb +146 -0
  40. data/lib/pindo/deploy/quswauth.rb +67 -0
  41. data/lib/pindo/deploy/reportbug.rb +135 -0
  42. data/lib/pindo/deploy/resign.rb +338 -0
  43. data/lib/pindo/deploy/tag.rb +108 -0
  44. data/lib/pindo/deploy/updateconfig.rb +129 -0
  45. data/lib/pindo/deploy/uploadipa.rb +63 -0
  46. data/lib/pindo/deploy.rb +44 -0
  47. data/lib/pindo/dev/autobuild.rb +204 -0
  48. data/lib/pindo/dev/autoresign.rb +186 -0
  49. data/lib/pindo/dev/confusecode.rb +127 -0
  50. data/lib/pindo/dev/confuseproj.rb +111 -0
  51. data/lib/pindo/dev/createbuild.rb +159 -0
  52. data/lib/pindo/dev/debug.rb +141 -0
  53. data/lib/pindo/dev/pub.rb +171 -0
  54. data/lib/pindo/dev/renewcert.rb +142 -0
  55. data/lib/pindo/dev.rb +23 -0
  56. data/lib/pindo/env/dreamstudio.rb +53 -0
  57. data/lib/pindo/env/flutter.rb +59 -0
  58. data/lib/pindo/env/flutter.sh +116 -0
  59. data/lib/pindo/env/quarkenv.rb +58 -0
  60. data/lib/pindo/env/swarkenv.rb +62 -0
  61. data/lib/pindo/env/workhard.rb +56 -0
  62. data/lib/pindo/env.rb +17 -0
  63. data/lib/pindo/ipa/autoresign.rb +188 -0
  64. data/lib/pindo/ipa/import.rb +261 -0
  65. data/lib/pindo/ipa/output.rb +396 -0
  66. data/lib/pindo/ipa.rb +22 -0
  67. data/lib/pindo/lib/forcepush.rb +159 -0
  68. data/lib/pindo/lib/lint.rb +115 -0
  69. data/lib/pindo/lib/push.rb +143 -0
  70. data/lib/pindo/lib/update.rb +75 -0
  71. data/lib/pindo/lib.rb +18 -0
  72. data/lib/pindo/module/appselect.rb +200 -0
  73. data/lib/pindo/module/appstore_in_app_purchase.rb +1803 -0
  74. data/lib/pindo/module/appstore_metadata_connect_api_helper.rb +12 -0
  75. data/lib/pindo/module/appstore_metadata_fastlane_helper.rb +922 -0
  76. data/lib/pindo/module/buildconfighelper.rb +13 -0
  77. data/lib/pindo/module/buildhelper.rb +76 -0
  78. data/lib/pindo/module/commonconfuseproj.rb +271 -0
  79. data/lib/pindo/module/config_project.sh +143 -0
  80. data/lib/pindo/module/configprojhelper.rb +631 -0
  81. data/lib/pindo/module/iap_tier.json +813 -0
  82. data/lib/pindo/module/icon_contents.json +116 -0
  83. data/lib/pindo/module/imessage_icon.json +91 -0
  84. data/lib/pindo/module/imgset_contents.json +21 -0
  85. data/lib/pindo/module/launchimg_contents.json +21 -0
  86. data/lib/pindo/module/pemcreate.rb +63 -0
  87. data/lib/pindo/module/pgyerhelper.rb +339 -0
  88. data/lib/pindo/module/xcodebuildpre.rb +258 -0
  89. data/lib/pindo/module/xcodehelper.rb +521 -0
  90. data/lib/pindo/options/appconfigoptions.rb +23 -0
  91. data/lib/pindo/options/deployoptions.rb +363 -0
  92. data/lib/pindo/pgyer/apptest.rb +104 -0
  93. data/lib/pindo/pgyer/comment.rb +95 -0
  94. data/lib/pindo/pgyer/download.rb +105 -0
  95. data/lib/pindo/pgyer/login.rb +61 -0
  96. data/lib/pindo/pgyer/upload.rb +234 -0
  97. data/lib/pindo/pgyer.rb +17 -0
  98. data/lib/pindo/repo/clone.rb +78 -0
  99. data/lib/pindo/repo/create.rb +55 -0
  100. data/lib/pindo/repo/login.rb +64 -0
  101. data/lib/pindo/repo/search.rb +60 -0
  102. data/lib/pindo/repo.rb +16 -0
  103. data/lib/pindo/setup.rb +60 -0
  104. data/lib/pindo/upgrade.rb +56 -0
  105. data/lib/pindo/utils/applovin.rb +213 -0
  106. data/lib/pindo/utils/boss.rb +209 -0
  107. data/lib/pindo/utils/clearcert.rb +60 -0
  108. data/lib/pindo/utils/device.rb +279 -0
  109. data/lib/pindo/utils/icon.rb +91 -0
  110. data/lib/pindo/utils/icon.sh +133 -0
  111. data/lib/pindo/utils/podindex.rb +56 -0
  112. data/lib/pindo/utils/podindex.sh +30 -0
  113. data/lib/pindo/utils/renewproj.rb +146 -0
  114. data/lib/pindo/utils/tgate.rb +159 -0
  115. data/lib/pindo/utils/xcassets.rb +46 -0
  116. data/lib/pindo/utils/xcassets.sh +88 -0
  117. data/lib/pindo/utils.rb +29 -0
  118. data/lib/pindo/version.rb +110 -0
  119. data/lib/pindo.rb +34 -0
  120. metadata +364 -0
@@ -0,0 +1,922 @@
1
+
2
+ require 'fileutils'
3
+ require 'faraday'
4
+
5
+ module Pindo
6
+
7
+ module AppstoreMetadataConnectApiHelper
8
+
9
+ def all_languages
10
+ lang_array = %w[ar-SA ca cs da de-DE el en-AU en-CA en-GB en-US es-ES es-MX fi fr-CA fr-FR he hi hr hu id it ja ko ms nl-NL no pl pt-BR pt-PT ro ru sk sv th tr uk vi zh-Hans zh-Hant]
11
+
12
+ return lang_array
13
+ end
14
+
15
+ def display_type_dir_name
16
+
17
+ array = {
18
+ "APP_IPHONE_35" => "iphone_3.5_",
19
+ "APP_IPHONE_40" => "iphone_4.0_",
20
+ "APP_IPHONE_47" => "iphone_4.7_",
21
+ "APP_IPHONE_55" => "iphone_5.5_",
22
+ "APP_IPHONE_58" => "iphone_5.8_",
23
+ "APP_IPHONE_65" => "iphone_6.5_",
24
+ "APP_IPHONE_67" => "iphone_6.7_",
25
+ "APP_IPAD_97" => "ipad_97_",
26
+ "APP_IPAD_105" => "ipad_105_",
27
+ "APP_IPAD_PRO_129" => "ipad_",
28
+ "APP_IPAD_PRO_3GEN_11" => "ipad_11_",
29
+ "APP_IPAD_PRO_3GEN_129" => "ipadPro129_",
30
+ "APP_IPAD_PRO_6GEN_129" => "ipadPro129_",
31
+
32
+ "IMESSAGE_APP_IPHONE_40" => "im_4.0_",
33
+ "IMESSAGE_APP_IPHONE_47" => "im_4.7_",
34
+ "IMESSAGE_APP_IPHONE_55" => "im_5.5_",
35
+ "IMESSAGE_APP_IPHONE_58" => "im_5.8_",
36
+ "IMESSAGE_APP_IPHONE_61" => "im_6.1_",
37
+ "IMESSAGE_APP_IPHONE_65" => "im_6.5_",
38
+ "IMESSAGE_APP_IPHONE_67" => "im_6.7_",
39
+ "IMESSAGE_APP_IPAD_97" => "im_ipad_",
40
+ "IMESSAGE_APP_IPAD_105" => "im_ipad_",
41
+ "IMESSAGE_APP_IPAD_PRO_129" => "im_ipad_",
42
+ "IMESSAGE_APP_IPAD_PRO_3GEN_129" => "im_ipadPro129_",
43
+ "IMESSAGE_APP_IPAD_PRO_3GEN_11" => "im_ipadPro129_",
44
+ "IMESSAGE_APP_IPAD_PRO_6GEN_129" => "im_ipadPro129_",
45
+
46
+ "APP_WATCH_SERIES_3" => "watch_3_",
47
+ "APP_WATCH_SERIES_4" => "watch_4_",
48
+ "APP_WATCH_SERIES_7" => "watch_7_",
49
+ "APP_WATCH_ULTRA" => "watch_ul_",
50
+
51
+ "APP_DESKTO" => "desktop_"
52
+
53
+ }
54
+
55
+ return array
56
+
57
+ end
58
+
59
+
60
+ def camel_case_lower(string: nil)
61
+ string.split('_').inject([]) { |buffer, e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
62
+ end
63
+
64
+
65
+ def check_attributes(attributes: nil)
66
+ attributes = attributes || {}
67
+ new_attributes = {}
68
+ attributes.each do |key, value|
69
+ if !value.nil? && !value.to_s.empty?
70
+ new_attributes[key] = value
71
+ end
72
+ end
73
+
74
+ # puts JSON.pretty_generate(new_attributes)
75
+ return new_attributes
76
+ end
77
+
78
+ def fastlane_login(apple_id:nil)
79
+ Spaceship::Tunes.login(apple_id.to_s)
80
+ Spaceship::Tunes.select_team
81
+ end
82
+
83
+ def fastlane_update_app_version_info_metadata(app: nil, platform:nil, app_itunes_json:nil)
84
+
85
+
86
+ begin
87
+ puts "\n\n更新 Version ..."
88
+ app_version = app_itunes_json["app_edit_version_info"][platform]["version_string"]
89
+ app.ensure_version!(app_version)
90
+ puts "更新 Version 成功 !!!"
91
+ rescue => error
92
+ puts "更新 Version 失败 !!! ===============+++++++============= 失败 !!!失败 !!!"
93
+ puts error
94
+ end
95
+
96
+
97
+ app_edit_version_info = app.get_edit_app_store_version(platform: platform, includes: 'appStoreVersionSubmission,build,appStoreVersionPhasedRelease,appStoreVersionLocalizations')
98
+ app_live_version_info = app.get_live_app_store_version(platform: platform)
99
+
100
+ if !app_itunes_json["app_edit_version_info"][platform]['app_version_info_localization'].nil?
101
+ begin
102
+ puts
103
+ puts "更新 App Version Localizations..."
104
+ version_info_localization_attributes = app_itunes_json["app_edit_version_info"][platform]['app_version_info_localization']
105
+ version_info_localizations = verify_app_version_info_localizations(app_version_info:app_edit_version_info, version_info_localization_attributes:version_info_localization_attributes)
106
+ update_version_info_localizations(version_info_localizations:version_info_localizations, version_info_localization_attributes:version_info_localization_attributes, app_live_version_info:app_live_version_info)
107
+ puts "更新App Version Localizations 成功 !!!"
108
+ rescue => error
109
+ puts "更新App Version Localizations 失败 !!! ===============+++++++============= 失败 !!!失败 !!!"
110
+ puts error
111
+ end
112
+ end
113
+
114
+
115
+
116
+ if !app_itunes_json["app_edit_version_info"][platform]['copyright'].nil?
117
+ begin
118
+ puts "\n\n更新 Copy Right..."
119
+ app_edit_version_info.update(attributes: { "copyright": app_itunes_json["app_edit_version_info"][platform]['copyright']} )
120
+ puts "更新 Copy Right 成功 !!!"
121
+ rescue => error
122
+ puts "更新 Copy Right 失败 !!! ===============+++++++============= 失败 !!!失败 !!!"
123
+ puts error
124
+ end
125
+ end
126
+
127
+ if !app_itunes_json["app_edit_version_info"][platform]['release_type'].nil?
128
+ begin
129
+ puts "\n\n更新 ReleaseType ..."
130
+ app_edit_version_info.update(attributes: { "releaseType": app_itunes_json["app_edit_version_info"][platform]['release_type'] })
131
+ puts "更新 ReleaseType 成功 !!!"
132
+ rescue => error
133
+ puts "更新 ReleaseType 失败 !!! ===============+++++++============= 失败 !!!失败 !!!"
134
+ puts error
135
+ end
136
+ end
137
+
138
+ if !app_itunes_json["app_edit_version_info"][platform]['app_review_info'].nil?
139
+ begin
140
+ puts "\n\n更新 Review Info ..."
141
+ notes_file = "app_" + platform + "_review_notes.txt"
142
+ app_review_attributes = {}
143
+ app_review_data = app_itunes_json["app_edit_version_info"][platform]['app_review_info']
144
+ app_review_data.each do |key, value|
145
+ attributes_key = camel_case_lower(string:key)
146
+ app_review_attributes[attributes_key] = value
147
+ end
148
+ update_review_info(app_version_info:app_edit_version_info, app_review_attributes:app_review_attributes)
149
+ puts "更新 Review Info 成功 !!!"
150
+ rescue => error
151
+ puts "更新 Review Info 失败 !!! ===============+++++++============= 失败 !!!失败 !!!"
152
+ puts error
153
+ end
154
+ end
155
+
156
+
157
+ end
158
+
159
+ def fastlane_update_app_metadata(app: nil, app_itunes_json:nil)
160
+
161
+ begin
162
+ puts "\n\n更新 app价格 ..."
163
+ attributes = {}
164
+ attributes[:availableInNewTerritories] = true
165
+ territory_ids = Spaceship::ConnectAPI::Territory.all.map(&:id)
166
+ price_tier = "0"
167
+ app.update(attributes: attributes, app_price_tier_id: price_tier, territory_ids: territory_ids)
168
+ puts "更新 app价格 成功 !!!"
169
+ rescue => error
170
+ puts "更新 app价格 失败 !!! ===============+++++++============= 失败 !!!失败 !!!"
171
+ puts error
172
+ end
173
+
174
+
175
+
176
+ if !app_itunes_json['content_rights_declaration'].nil?
177
+ begin
178
+ puts "\n\n更新 Third Content ..."
179
+ app.update(attributes:{"contentRightsDeclaration": app_itunes_json['content_rights_declaration']})
180
+ puts "更新 Third Content 成功 !!!"
181
+ rescue => error
182
+ puts "更新 Third Content 失败 !!! ===============+++++++============= 失败 !!!失败 !!!"
183
+ puts error
184
+ end
185
+ end
186
+
187
+ if !app_itunes_json['primary_locale'].nil?
188
+ begin
189
+ puts "\n\n更新 Primary Language ..."
190
+ app.update(attributes:{"primaryLocale": app_itunes_json['primary_locale']})
191
+ puts "更新 Primary Language 成功 !!!"
192
+ rescue => error
193
+ puts "更新 Primary Language 失败 !!! ===============+++++++============= 失败 !!!失败 !!!"
194
+ puts error
195
+ end
196
+ end
197
+
198
+
199
+ if !app_itunes_json['privacy_data'].nil?
200
+ # begin
201
+ puts "\n\n更新 Privacy Usage Data ..."
202
+ app_privacy_data = app_itunes_json['privacy_data']
203
+ update_privacy_useagedata(app: app, app_privacy_data:app_privacy_data)
204
+
205
+ # rescue => error
206
+ # puts "更新 Privacy Usage Data 失败 !!! ===============+++++++============= 失败 !!!失败 !!!"
207
+ # puts error
208
+ # end
209
+ end
210
+
211
+
212
+ end
213
+
214
+
215
+ def fastlane_update_app_info_metadata(app: nil, app_itunes_json:nil)
216
+
217
+
218
+ app_info = app.fetch_edit_app_info
219
+
220
+ begin
221
+ puts "\n\n更新 Category ..."
222
+ update_app_categories(app_info:app_info, app_info_data:app_itunes_json["app_info"])
223
+ puts "更新 Category 成功 !!!"
224
+ rescue => error
225
+ puts "更新 Category 失败 !!! ===============+++++++============= 失败 !!!失败 !!!"
226
+ puts error
227
+ end
228
+
229
+ if !app_age_rating_attributes = app_itunes_json["app_info"]["app_age_rating"].nil?
230
+ begin
231
+ puts "\n\n更新 Age Rating ..."
232
+ app_age_rating_attributes = app_itunes_json["app_info"]["app_age_rating"]
233
+ update_age_rating(app_info:app_info, age_rate_config:app_age_rating_attributes)
234
+ puts "更新 Age Rating 成功 !!!"
235
+ rescue => error
236
+ puts "更新 Age Rating 失败 !!! ===============+++++++============= 失败 !!!失败 !!!"
237
+ puts error
238
+ end
239
+ end
240
+
241
+ end
242
+
243
+
244
+ def fastlane_update_app_info_localizations(app: nil, app_itunes_json:nil)
245
+
246
+ app_info = app.fetch_edit_app_info
247
+
248
+ sleep(3)
249
+
250
+ begin
251
+ puts
252
+ puts "更新 App Info Localizations..."
253
+ app_info_localization_attributes = app_itunes_json['app_info']["app_info_localization"]
254
+ app_info_localizations = verify_app_info_localizations(app_info:app_info, app_info_localization_attributes:app_info_localization_attributes)
255
+ update_app_info_localizations(app_info_localizations:app_info_localizations, app_info_localization_attributes:app_info_localization_attributes)
256
+ update_app_info_localizations(app_info_localizations:app_info_localizations, app_info_localization_attributes:app_info_localization_attributes)
257
+ puts "更新App Info Localizations 成功 !!!"
258
+ rescue => error
259
+ puts "更新App Info Localizations 失败 !!! ===============+++++++============= 失败 !!!失败 !!!"
260
+ puts error
261
+ end
262
+
263
+
264
+ end
265
+
266
+
267
+
268
+
269
+ def update_privacy_useagedata(app: nil, app_privacy_data:nil)
270
+ all_usages = Spaceship::ConnectAPI::AppDataUsage.all(app_id: app.id, includes: "category,grouping,purpose,dataProtection", limit: 500)
271
+
272
+ begin
273
+ all_usages.each(&:delete!)
274
+ rescue => error
275
+
276
+ end
277
+
278
+ # old_usages_config = {}
279
+ # if !all_usages.nil? && all_usages.size > 0
280
+ # all_usages.each do |privacy_usage|
281
+ # if !privacy_usage.category.nil?
282
+ # category= privacy_usage.category.id
283
+ # all_usages_config[category] = all_usages_config[category] || {}
284
+ # all_usages_config[category]["category"] = category
285
+ # if !privacy_usage.purpose.nil?
286
+ # all_usages_config[category]["purposes"] = all_usages_config[category]["purposes"] || []
287
+ # all_usages_config[category]["purposes"] << privacy_usage.purpose.id
288
+
289
+ # end
290
+ # if !privacy_usage.data_protection.nil?
291
+ # all_usages_config[category]["data_protections"] = all_usages_config[category]["data_protections"] || []
292
+ # all_usages_config[category]["data_protections"] << privacy_usage.data_protection.id
293
+ # end
294
+ # end
295
+ # end
296
+ # puts old_usages_config
297
+ # end
298
+
299
+ # new_usages_config = {}
300
+ # app_privacy_data.each do |usage_config|
301
+ # category = usage_config["category"]
302
+ # if category && !category.nil?
303
+ # new_usages_config[category] = usage_config
304
+ # end
305
+ # end
306
+
307
+ begin
308
+ publish_state = Spaceship::ConnectAPI::AppDataUsagesPublishState.get(app_id: app.id)
309
+ publish_state.publish!
310
+ rescue => error
311
+ puts error
312
+ end
313
+
314
+
315
+ app_privacy_data.each do |usage_config|
316
+ category = usage_config["category"]
317
+ purposes = usage_config["purposes"] || []
318
+ data_protections = usage_config["data_protections"] || []
319
+ purposes = [nil] if purposes.empty?
320
+
321
+ purposes.each do |purpose|
322
+ data_protections.each do |data_protection|
323
+ begin
324
+ Spaceship::ConnectAPI::AppDataUsage.create(
325
+ app_id: app.id,
326
+ app_data_usage_category_id: category,
327
+ app_data_usage_protection_id: data_protection,
328
+ app_data_usage_purpose_id: purpose
329
+ )
330
+ rescue => error
331
+
332
+ end
333
+
334
+
335
+ end
336
+ end
337
+ end
338
+
339
+
340
+
341
+ begin
342
+
343
+ publish_state = Spaceship::ConnectAPI::AppDataUsagesPublishState.get(app_id: app.id)
344
+ publish_state.publish!
345
+ rescue => error
346
+ puts error
347
+ end
348
+
349
+
350
+ end
351
+
352
+
353
+ def update_app_categories(app_info:nil, app_info_data:nil)
354
+
355
+
356
+ if !app_info_data.nil?
357
+ category_id_map = {}
358
+
359
+ if !app_info_data["primary_category"].nil?
360
+ category_id_map[:primary_category_id] = app_info_data["primary_category"]
361
+
362
+ if app_info_data["primary_category"].eql?("STICKERS") || app_info_data["primary_category"].eql?("GAMES")
363
+ category_id_map[:primary_subcategory_one_id] = app_info_data["primary_subcategory_one"]
364
+ category_id_map[:primary_subcategory_two_id] = app_info_data["primary_subcategory_two"]
365
+
366
+ else
367
+ category_id_map[:primary_subcategory_one_id] = nil
368
+ category_id_map[:primary_subcategory_two_id] = nil
369
+ end
370
+ end
371
+
372
+
373
+
374
+ if !app_info_data["secondary_category"].nil? && !app_info_data["primary_category"].eql?("STICKERS") && !app_info_data["primary_category"].eql?("GAMES")
375
+ category_id_map[:secondary_category_id] = app_info_data["secondary_category"]
376
+ if app_info_data["secondary_category"].eql?("STICKERS") || app_info_data["secondary_category"].eql?("GAMES")
377
+ category_id_map[:secondary_subcategory_one_id] = app_info_data["secondary_subcategory_one"]
378
+ category_id_map[:secondary_subcategory_two_id] = app_info_data["secondary_subcategory_two"]
379
+ else
380
+ category_id_map[:secondary_subcategory_one_id] = nil
381
+ category_id_map[:secondary_subcategory_two_id] = nil
382
+ end
383
+ else
384
+ category_id_map[:secondary_category_id] = nil
385
+ category_id_map[:secondary_subcategory_one_id] = nil
386
+ category_id_map[:secondary_subcategory_two_id] = nil
387
+ end
388
+
389
+ app_info.update_categories(category_id_map: category_id_map)
390
+
391
+ end
392
+
393
+ end
394
+
395
+
396
+
397
+ def update_age_rating(app_info:nil, age_rate_config:nil)
398
+ declaration = app_info.fetch_age_rating_declaration unless app_info.nil?
399
+ age_rate_attributes = {}
400
+
401
+ age_rate_config.each do |key, value|
402
+
403
+ attributes_key = camel_case_lower(string:key)
404
+ age_rate_attributes[attributes_key] = value
405
+ end
406
+
407
+ declaration.update(attributes: age_rate_attributes)
408
+
409
+ end
410
+
411
+ def verify_app_info_localizations(app_info:nil, app_info_localization_attributes:nil)
412
+
413
+ localizations = app_info.get_app_info_localizations
414
+
415
+ languages = []
416
+ app_info_localization_attributes.each do |lang , attributes |
417
+ languages << lang
418
+ end
419
+
420
+ puts " 存在多语言 #{localizations.map(&:locale).join(', ')}..."
421
+ locales_to_enable = languages - localizations.map(&:locale)
422
+
423
+ if locales_to_enable.count > 0
424
+
425
+
426
+ puts " 创建多语言 #{locales_to_enable.join(', ')}..."
427
+
428
+ locales_to_enable.each do |locale|
429
+ localization_attributes = app_info_localization_attributes[locale]
430
+ app_info.create_app_info_localization(attributes: {
431
+ locale: locale,
432
+ name:localization_attributes["name"]
433
+ })
434
+ end
435
+
436
+ localizations = app_info.get_app_info_localizations
437
+
438
+ end
439
+
440
+ return localizations
441
+ end
442
+
443
+ def update_app_info_localizations(app_info_localizations:nil, app_info_localization_attributes:nil)
444
+
445
+ # Update app info localizations
446
+ app_info_worker = FastlaneCore::QueueWorker.new do |app_info_localization|
447
+ attributes = app_info_localization_attributes[app_info_localization.locale]
448
+
449
+ if attributes
450
+ puts "Uploading app info localized '#{app_info_localization.locale}'"
451
+ attributes = check_attributes(attributes:attributes)
452
+ app_info_localization.update(attributes: attributes)
453
+ end
454
+ end
455
+ app_info_worker.batch_enqueue(app_info_localizations)
456
+ app_info_worker.start
457
+
458
+ end
459
+
460
+
461
+ def verify_app_version_info_localizations(app_version_info:nil, version_info_localization_attributes:nil)
462
+
463
+ localizations = app_version_info.get_app_store_version_localizations
464
+
465
+ languages = []
466
+ version_info_localization_attributes.each do |lang , attributes |
467
+ languages << lang
468
+ end
469
+
470
+ puts " 存在多语言 #{localizations.map(&:locale).join(', ')}..."
471
+
472
+ locales_to_enable = languages - localizations.map(&:locale)
473
+
474
+ if locales_to_enable.count > 0
475
+
476
+ puts " 创建多语言 #{locales_to_enable.join(', ')}..."
477
+
478
+ locales_to_enable.each do |locale|
479
+ localization_attributes = version_info_localization_attributes[locale]
480
+ app_version_info.create_app_store_version_localization(attributes: {
481
+ locale: locale
482
+ })
483
+ end
484
+
485
+ localizations = app_version_info.get_app_store_version_localizations
486
+ end
487
+
488
+ return localizations
489
+ end
490
+
491
+
492
+ def update_version_info_localizations(version_info_localizations:nil, version_info_localization_attributes:nil, app_live_version_info:nil)
493
+ # Update app store version localizations
494
+ store_version_worker = FastlaneCore::QueueWorker.new do |app_store_version_localization|
495
+ attributes = version_info_localization_attributes[app_store_version_localization.locale]
496
+
497
+ if attributes
498
+ puts "Uploading app version info localized '#{app_store_version_localization.locale}'"
499
+ attributes = check_attributes(attributes:attributes)
500
+ if app_live_version_info.nil?
501
+ attributes.delete("whats_new")
502
+ end
503
+ app_store_version_localization.update(attributes: attributes)
504
+ end
505
+ end
506
+ store_version_worker.batch_enqueue(version_info_localizations)
507
+ store_version_worker.start
508
+ end
509
+
510
+ def update_review_info(app_version_info:nil, app_review_attributes:nil)
511
+ app_store_review_detail = begin
512
+ app_version_info.fetch_app_store_review_detail
513
+ rescue => error
514
+ puts "no review detail !!!"
515
+ end # errors if doesn't exist
516
+
517
+ if app_store_review_detail
518
+ puts "更新review info obj"
519
+ app_store_review_detail.update(attributes: app_review_attributes)
520
+ else
521
+ puts "创建review info obj"
522
+ app_version_info.create_app_store_review_detail(attributes: app_review_attributes)
523
+ end
524
+ end
525
+
526
+ def fastlane_process_lang_screenshots(lang_screenshots_path:nil)
527
+
528
+ # puts "正在处理目录:#{lang_screenshots_path}"
529
+ valid_file_extensions = ['png', 'PNG', 'jpg', 'JPG', 'jpeg', 'JPEG']
530
+
531
+ Dir.glob(File.join(lang_screenshots_path, "*")).each do |image_dir_path|
532
+ image_dir_basename = File.basename(image_dir_path)
533
+ # puts "处理目录:#{image_dir_path}"
534
+ # puts "basename:#{image_dir_basename}"
535
+ if File.directory?(image_dir_path) && ![".", ".."].include?(image_dir_basename)
536
+ Dir.foreach(image_dir_path) do |file|
537
+
538
+ image_full_name = File.join(image_dir_path, file)
539
+ extname = File.extname(image_full_name).delete('.')
540
+ extension = File.extname(image_full_name)
541
+ base_name = File.basename(image_full_name, extension)
542
+ dest_name = File.join(lang_screenshots_path, file)
543
+
544
+ if valid_file_extensions.include?(extname)
545
+ new_base_name = base_name + extension
546
+ if base_name.to_s.size < 2
547
+ new_base_name = "0"+base_name + extension
548
+ end
549
+ img_size = FastImage.size(image_full_name)
550
+
551
+
552
+ if lang_screenshots_path.include?("/iMessage/") || lang_screenshots_path.include?("/imessage/") || lang_screenshots_path.include?("/IMESSAGE/")
553
+
554
+ all_device_size = Deliver::AppScreenshot.device_messages
555
+ # puts all_message_device_size
556
+
557
+ if all_device_size[Deliver::AppScreenshot::ScreenSize::IOS_IPAD_PRO_MESSAGES].include?(img_size)
558
+ if image_dir_basename.to_s.downcase.include?("ipadpro3") || image_dir_basename.to_s.downcase.include?("ipadpro129") || image_dir_basename.to_s.downcase.include?("ipad_6gen")
559
+ dest_name = File.join(lang_screenshots_path, display_type_dir_name["IMESSAGE_APP_IPAD_PRO_6GEN_129"] + new_base_name)
560
+ else
561
+ dest_name = File.join(lang_screenshots_path, display_type_dir_name["IMESSAGE_APP_IPAD_PRO_129"] + new_base_name)
562
+ end
563
+ elsif all_device_size[Deliver::AppScreenshot::ScreenSize::IOS_67_MESSAGES].include?(img_size)
564
+ dest_name = File.join(lang_screenshots_path, display_type_dir_name["IMESSAGE_APP_IPHONE_67"] + new_base_name)
565
+ elsif all_device_size[Deliver::AppScreenshot::ScreenSize::IOS_65_MESSAGES].include?(img_size)
566
+ dest_name = File.join(lang_screenshots_path, display_type_dir_name["IMESSAGE_APP_IPHONE_65"] + new_base_name)
567
+ elsif all_device_size[Deliver::AppScreenshot::ScreenSize::IOS_55_MESSAGES].include?(img_size)
568
+ dest_name = File.join(lang_screenshots_path, display_type_dir_name["IMESSAGE_APP_IPHONE_55"] + new_base_name)
569
+ end
570
+
571
+ else
572
+ all_device_size = Deliver::AppScreenshot.devices
573
+ # puts all_device_size
574
+ if all_device_size[Deliver::AppScreenshot::ScreenSize::IOS_IPAD_PRO].include?(img_size)
575
+ if image_dir_basename.to_s.downcase.include?("ipadpro3") || image_dir_basename.to_s.downcase.include?("ipadpro129") || image_dir_basename.to_s.downcase.include?("ipad_6gen")
576
+ dest_name = File.join(lang_screenshots_path, display_type_dir_name["APP_IPAD_PRO_6GEN_129"] + new_base_name)
577
+ else
578
+ dest_name = File.join(lang_screenshots_path, display_type_dir_name["APP_IPAD_PRO_129"] + new_base_name)
579
+ end
580
+ elsif all_device_size[Deliver::AppScreenshot::ScreenSize::IOS_67].include?(img_size)
581
+ dest_name = File.join(lang_screenshots_path, display_type_dir_name["APP_IPHONE_67"] + new_base_name)
582
+ elsif all_device_size[Deliver::AppScreenshot::ScreenSize::IOS_65].include?(img_size)
583
+ dest_name = File.join(lang_screenshots_path, display_type_dir_name["APP_IPHONE_65"] + new_base_name)
584
+ elsif all_device_size[Deliver::AppScreenshot::ScreenSize::IOS_55].include?(img_size)
585
+ dest_name = File.join(lang_screenshots_path, display_type_dir_name["APP_IPHONE_55"] + new_base_name)
586
+ end
587
+ end
588
+
589
+ # if (img_size[0] == 1290 && img_size[1] == 2796) || (img_size[0] == 2796 && img_size[1] == 1290)
590
+ # dest_name = File.join(lang_screenshots_path, display_type_dir_name["APP_IPHONE_67"] + new_base_name)
591
+ # end
592
+ # if (img_size[0] == 1242 && img_size[1] == 2688) || (img_size[0] == 2688 && img_size[1] == 1242) || (img_size[0] == 1284 && img_size[1] == 2778) || (img_size[0] == 2778 && img_size[1] == 1284)
593
+ # dest_name = File.join(lang_screenshots_path, display_type_dir_name["APP_IPHONE_65"] + new_base_name)
594
+ # end
595
+
596
+ # if (img_size[0] == 1242 && img_size[1] == 2208) || (img_size[0] == 2208 && img_size[1] == 1242)
597
+ # dest_name = File.join(lang_screenshots_path, display_type_dir_name["APP_IPHONE_55"] + new_base_name)
598
+ # end
599
+
600
+ FileUtils.mv(image_full_name, dest_name, force:true)
601
+ end
602
+
603
+ end
604
+
605
+ FileUtils.rm_rf(image_dir_path)
606
+ end
607
+
608
+ end
609
+
610
+
611
+
612
+
613
+ end
614
+
615
+
616
+
617
+
618
+ def fastlane_download_app_info(app: nil, app_itunes_json:nil, app_itunes_dir:nil)
619
+
620
+
621
+ app_info = app.fetch_edit_app_info || app.fetch_live_app_info
622
+
623
+ if app_info.primary_category.nil?
624
+ app_itunes_json["app_info"]["primary_category"] = app_info.primary_category
625
+ else
626
+ app_itunes_json["app_info"]["primary_category"] = app_info.primary_category.id
627
+ end
628
+
629
+ if app_info.primary_subcategory_one.nil?
630
+ app_itunes_json["app_info"]["primary_subcategory_one"] = app_info.primary_subcategory_one
631
+ else
632
+ app_itunes_json["app_info"]["primary_subcategory_one"] = app_info.primary_subcategory_one.id
633
+ end
634
+
635
+ if app_info.primary_subcategory_two.nil?
636
+ app_itunes_json["app_info"]["primary_subcategory_two"] = app_info.primary_subcategory_two
637
+ else
638
+ app_itunes_json["app_info"]["primary_subcategory_two"] = app_info.primary_subcategory_two.id
639
+ end
640
+
641
+ if app_info.secondary_category.nil?
642
+ app_itunes_json["app_info"]["secondary_category"] = app_info.secondary_category
643
+ else
644
+ app_itunes_json["app_info"]["secondary_category"] = app_info.secondary_category.id
645
+ end
646
+
647
+ if app_info.secondary_subcategory_one.nil?
648
+ app_itunes_json["app_info"]["secondary_subcategory_one"] = app_info.secondary_subcategory_one
649
+ else
650
+ app_itunes_json["app_info"]["secondary_subcategory_one"] = app_info.secondary_subcategory_one.id
651
+ end
652
+
653
+ if app_info.secondary_subcategory_two.nil?
654
+ app_itunes_json["app_info"]["secondary_subcategory_two"] = app_info.secondary_subcategory_two
655
+ else
656
+ app_itunes_json["app_info"]["secondary_subcategory_two"] = app_info.secondary_subcategory_two.id
657
+ end
658
+
659
+ age_rating_declaration = app_info.fetch_age_rating_declaration
660
+ if !age_rating_declaration.nil?
661
+
662
+ app_itunes_json["app_info"]["app_age_rating"] = app_itunes_json["app_info"]["app_age_rating"] || {}
663
+ app_itunes_json["app_info"]["app_age_rating"]["alcohol_tobacco_or_drug_use_or_references"] = age_rating_declaration.alcohol_tobacco_or_drug_use_or_references.nil? ? "NONE" : age_rating_declaration.alcohol_tobacco_or_drug_use_or_references
664
+ app_itunes_json["app_info"]["app_age_rating"]["contests"] = age_rating_declaration.contests.nil? ? "NONE" : age_rating_declaration.contests
665
+ app_itunes_json["app_info"]["app_age_rating"]["gambling_simulated"] = age_rating_declaration.gambling_simulated.nil? ? "NONE" : age_rating_declaration.gambling_simulated
666
+ app_itunes_json["app_info"]["app_age_rating"]["medical_or_treatment_information"] = age_rating_declaration.medical_or_treatment_information.nil? ? "NONE" : age_rating_declaration.medical_or_treatment_information
667
+ app_itunes_json["app_info"]["app_age_rating"]["profanity_or_crude_humor"] = age_rating_declaration.profanity_or_crude_humor.nil? ? "NONE" : age_rating_declaration.profanity_or_crude_humor
668
+ app_itunes_json["app_info"]["app_age_rating"]["sexual_content_graphic_and_nudity"] = age_rating_declaration.sexual_content_graphic_and_nudity.nil? ? "NONE" : age_rating_declaration.sexual_content_graphic_and_nudity
669
+ app_itunes_json["app_info"]["app_age_rating"]["sexual_content_or_nudity"] = age_rating_declaration.sexual_content_or_nudity.nil? ? "NONE" : age_rating_declaration.sexual_content_or_nudity
670
+ app_itunes_json["app_info"]["app_age_rating"]["horror_or_fear_themes"] = age_rating_declaration.horror_or_fear_themes.nil? ? "NONE" : age_rating_declaration.horror_or_fear_themes
671
+ app_itunes_json["app_info"]["app_age_rating"]["mature_or_suggestive_themes"] = age_rating_declaration.mature_or_suggestive_themes.nil? ? "NONE" : age_rating_declaration.mature_or_suggestive_themes
672
+ app_itunes_json["app_info"]["app_age_rating"]["violence_cartoon_or_fantasy"] = age_rating_declaration.violence_cartoon_or_fantasy.nil? ? "NONE" : age_rating_declaration.violence_cartoon_or_fantasy
673
+ app_itunes_json["app_info"]["app_age_rating"]["violence_realistic_prolonged_graphic_or_sadistic"] = age_rating_declaration.violence_realistic_prolonged_graphic_or_sadistic.nil? ? "NONE" : age_rating_declaration.violence_realistic_prolonged_graphic_or_sadistic
674
+ app_itunes_json["app_info"]["app_age_rating"]["violence_realistic"] = age_rating_declaration.violence_realistic.nil? ? "NONE" : age_rating_declaration.violence_realistic
675
+ app_itunes_json["app_info"]["app_age_rating"]["gambling"] = age_rating_declaration.gambling.nil? ? false : age_rating_declaration.gambling
676
+ app_itunes_json["app_info"]["app_age_rating"]["unrestricted_web_access"] = age_rating_declaration.unrestricted_web_access.nil? ? false : age_rating_declaration.unrestricted_web_access
677
+ app_itunes_json["app_info"]["app_age_rating"]["kids_age_band"] = age_rating_declaration.kids_age_band.nil? ? nil : age_rating_declaration.kids_age_band
678
+ app_itunes_json["app_info"]["app_age_rating"]["seventeen_plus"] = age_rating_declaration.seventeen_plus.nil? ? false : age_rating_declaration.seventeen_plus
679
+ end
680
+
681
+
682
+
683
+
684
+
685
+
686
+
687
+
688
+
689
+
690
+
691
+
692
+
693
+ app_info_localizations = app_info.get_app_info_localizations
694
+
695
+ if !app_info_localizations.nil?
696
+
697
+ locales_to_disable = all_languages - app_info_localizations.map(&:locale)
698
+
699
+ locales_to_disable.each do | lang |
700
+ app_itunes_json["app_info"]["app_info_localization"].delete(lang)
701
+ end
702
+
703
+
704
+ app_info_localizations.each do |app_info_localization|
705
+
706
+ lang = app_info_localization.locale
707
+
708
+ app_itunes_json["app_info"]["app_info_localization"][lang] = {}
709
+ app_info_localization_data = app_itunes_json["app_info"]["app_info_localization"][lang]
710
+
711
+ app_info_localization_data["name"] = app_info_localization.name.nil? ? "" : app_info_localization.name
712
+ app_info_localization_data["subtitle"] = app_info_localization.subtitle.nil? ? "" : app_info_localization.subtitle
713
+ app_info_localization_data["privacy_policy_url"] = app_info_localization.privacy_policy_url.nil? ? "" : app_info_localization.privacy_policy_url
714
+ app_info_localization_data["privacy_choices_url"] = app_info_localization.privacy_choices_url.nil? ? "" : app_info_localization.privacy_choices_url
715
+ app_info_localization_data["privacy_policy_text"] = app_info_localization.privacy_policy_text.nil? ? "" : app_info_localization.privacy_policy_text
716
+
717
+ end
718
+ end
719
+
720
+
721
+ end
722
+
723
+ def fastlane_download_app_version_info(app_version_info: nil, platform:nil, app_itunes_json:nil, app_itunes_dir:nil)
724
+
725
+ metadata_platform_path = File.join(app_itunes_dir, platform.downcase)
726
+ if !File.exist?(metadata_platform_path)
727
+ FileUtils.mkdir_p(metadata_platform_path)
728
+ end
729
+ app_itunes_json["app_edit_version_info"][platform] = {}
730
+ app_itunes_json["app_edit_version_info"][platform]["app_review_info"] = {}
731
+
732
+ app_itunes_json["app_edit_version_info"][platform]["version_string"] = app_version_info.version_string.nil? ? "" : app_version_info.version_string
733
+ app_itunes_json["app_edit_version_info"][platform]["copyright"] = app_version_info.copyright.nil? ? "" : app_version_info.copyright
734
+ app_itunes_json["app_edit_version_info"][platform]["release_type"] = app_version_info.release_type.nil? ? "" : app_version_info.release_type
735
+
736
+
737
+
738
+ app_store_review_data = app_itunes_json["app_edit_version_info"][platform]["app_review_info"]
739
+ app_store_review_detail = begin
740
+ app_version_info.fetch_app_store_review_detail
741
+ rescue => error
742
+ puts "no review detail !!!"
743
+ end # errors if doesn't exist
744
+
745
+ if !app_store_review_detail.nil?
746
+ app_store_review_data["contact_first_name"] = app_store_review_detail.contact_first_name
747
+ app_store_review_data["contact_last_name"] = app_store_review_detail.contact_last_name
748
+ app_store_review_data["contact_phone"] = app_store_review_detail.contact_phone
749
+ app_store_review_data["contact_email"] = app_store_review_detail.contact_email
750
+ app_store_review_data["demo_account_name"] = app_store_review_detail.demo_account_name
751
+ app_store_review_data["demo_account_password"] = app_store_review_detail.demo_account_password
752
+ app_store_review_data["demo_account_required"] = app_store_review_detail.demo_account_required
753
+ app_store_review_data["notes"] = app_store_review_detail.notes
754
+ else
755
+ app_store_review_data["contact_first_name"] = ""
756
+ app_store_review_data["contact_last_name"] = ""
757
+ app_store_review_data["contact_phone"] = ""
758
+ app_store_review_data["contact_email"] = ""
759
+ app_store_review_data["demo_account_name"] = ""
760
+ app_store_review_data["demo_account_password"] = ""
761
+ app_store_review_data["demo_account_required"] = false
762
+ app_store_review_data["notes"] = ""
763
+ end
764
+
765
+ app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"] = app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"] || {}
766
+
767
+ # app_itunes_json["app_edit_version_info"][platform]["app_version_screenshots"] = app_itunes_json["app_edit_version_info"][platform]["app_version_screenshots"] || {}
768
+ # app_itunes_json["app_edit_version_info"][platform]["app_version_previews"] = app_itunes_json["app_edit_version_info"][platform]["app_version_previews"] || {}
769
+
770
+ app_version_info_localizations = app_version_info.get_app_store_version_localizations(includes: 'appPreviewSets,appScreenshotSets')
771
+
772
+ locales_to_disable = all_languages - app_version_info_localizations.map(&:locale)
773
+
774
+ locales_to_disable.each do | lang |
775
+ metadata_platform_lang_path = File.join(metadata_platform_path, lang)
776
+ if File.exist?(metadata_platform_lang_path)
777
+ FileUtils.rm_rf(metadata_platform_lang_path)
778
+ end
779
+
780
+ app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"].delete(lang)
781
+ # app_itunes_json["app_edit_version_info"][platform]["app_version_screenshots"].delete(lang)
782
+ # app_itunes_json["app_edit_version_info"][platform]["app_version_previews"].delete(lang)
783
+ end
784
+
785
+ if !app_version_info_localizations.nil?
786
+
787
+ app_version_info_localizations.each do |app_version_info_localization|
788
+
789
+ lang = app_version_info_localization.locale
790
+
791
+ lang_txt_path = File.join(metadata_platform_path, lang)
792
+
793
+ if !File.exist?(lang_txt_path)
794
+ FileUtils.mkdir_p(lang_txt_path)
795
+ end
796
+
797
+ app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang] = app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang] || {}
798
+
799
+ localization_data = app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang]
800
+
801
+
802
+ localization_data["description"] = app_version_info_localization.description
803
+ localization_data["keywords"] = app_version_info_localization.keywords
804
+ localization_data["support_url"] = app_version_info_localization.support_url
805
+ localization_data["marketing_url"] = app_version_info_localization.marketing_url
806
+ localization_data["promotional_text"] = app_version_info_localization.promotional_text
807
+ localization_data["whats_new"] = app_version_info_localization.whats_new
808
+
809
+
810
+ write_app_version_info_localization_to_txt(lang_txt_path: lang_txt_path, key_name:"description", key_value:localization_data["description"])
811
+ write_app_version_info_localization_to_txt(lang_txt_path: lang_txt_path, key_name:"keywords", key_value:localization_data["keywords"])
812
+ write_app_version_info_localization_to_txt(lang_txt_path: lang_txt_path, key_name:"support_url", key_value:localization_data["support_url"])
813
+ write_app_version_info_localization_to_txt(lang_txt_path: lang_txt_path, key_name:"marketing_url", key_value:localization_data["marketing_url"])
814
+ write_app_version_info_localization_to_txt(lang_txt_path: lang_txt_path, key_name:"promotional_text", key_value:localization_data["promotional_text"])
815
+ write_app_version_info_localization_to_txt(lang_txt_path: lang_txt_path, key_name:"whats_new", key_value:localization_data["whats_new"])
816
+
817
+ # app_itunes_json["app_edit_version_info"][platform]["app_version_screenshots"][app_version_info_localization.locale] = app_itunes_json["app_edit_version_info"][platform]["app_version_screenshots"][app_version_info_localization.locale] || []
818
+ # app_itunes_json["app_edit_version_info"][platform]["app_version_previews"][app_version_info_localization.locale] = app_itunes_json["app_edit_version_info"][platform]["app_version_previews"][app_version_info_localization.locale] || []
819
+ end
820
+
821
+ end
822
+
823
+ end
824
+
825
+
826
+ def write_app_version_info_localization_to_txt(lang_txt_path: nil, key_name:nil, key_value:nil)
827
+ key_name_file = File.join(lang_txt_path, key_name +".txt")
828
+ File.open(key_name_file, "w") do |file|
829
+ file.write(key_value)
830
+ file.close
831
+ end
832
+ end
833
+
834
+ def fastlane_download_app_screenshots(app_version_info: nil, platform:nil, app_screenshots_dir:nil, over_write:false)
835
+
836
+
837
+ screenshots_platform_path = File.join(app_screenshots_dir, platform.downcase)
838
+ begin
839
+ FileUtils.mkdir_p(File.join(screenshots_platform_path))
840
+ rescue
841
+ # if it's already there
842
+ end
843
+
844
+
845
+ app_version_info_localizations = app_version_info.get_app_store_version_localizations
846
+
847
+ threads = []
848
+ app_version_info_localizations.each do |app_version_info_localization|
849
+ threads << Thread.new do
850
+ fastlane_download_app_screenshot_exe(screenshots_platform_path, app_version_info_localization, over_write:over_write)
851
+ end
852
+ end
853
+ threads.each(&:join)
854
+
855
+ end
856
+
857
+ def fastlane_download_app_screenshot_exe(folder_path, localization, over_write:false)
858
+ language = localization.locale
859
+
860
+ screenshot_sets = localization.get_app_screenshot_sets
861
+ screenshot_sets.each do |screenshot_set|
862
+
863
+ # If the screen shot is for an appleTV we need to store it in a way that we'll know it's an appleTV
864
+ # screen shot later as the screen size is the same as an iPhone 6 Plus in landscape.
865
+ if screenshot_set.apple_tv?
866
+ containing_folder = File.join(folder_path, "appleTV", language)
867
+ else
868
+ containing_folder = File.join(folder_path, language)
869
+ end
870
+
871
+ if screenshot_set.imessage?
872
+ containing_folder = File.join(folder_path, "iMessage", language)
873
+ end
874
+
875
+ begin
876
+ FileUtils.mkdir_p(containing_folder)
877
+ rescue
878
+ # if it's already there
879
+ end
880
+
881
+ puts "======== #{screenshot_set.screenshot_display_type}"
882
+ dir_name = display_type_dir_name[screenshot_set.screenshot_display_type]
883
+
884
+
885
+ screenshot_set.app_screenshots.each_with_index do |screenshot, index|
886
+ name_index = index
887
+ if index < 10
888
+ name_index = "0" + index.to_s
889
+ end
890
+ file_name = [dir_name, name_index].join()
891
+
892
+
893
+ original_file_extension = File.extname(screenshot.file_name).strip.downcase[1..-1]
894
+ file_name += "." + original_file_extension
895
+
896
+ url = screenshot.image_asset_url(type: original_file_extension)
897
+ next if url.nil?
898
+
899
+
900
+ path = File.join(containing_folder, file_name)
901
+ download_screenshots_exe(file_name:path, url:url, over_write:over_write)
902
+ end
903
+ end
904
+ end
905
+
906
+ def download_screenshots_exe(file_name:nil, url:nil, over_write:nil)
907
+
908
+ if !over_write && File.exist?(file_name)
909
+ puts " Existing screenshot #{file_name}"
910
+ return
911
+ end
912
+
913
+ puts "Downloading existing screenshot #{file_name}"
914
+
915
+ File.binwrite(file_name, FastlaneCore::Helper.open_uri(url).read)
916
+
917
+ end
918
+
919
+
920
+ end
921
+
922
+ end