manasimu 0.0.30 → 0.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/db/card_type_aggregate +0 -0
- data/lib/manasimu/api_util.rb +251 -0
- data/lib/manasimu/card.rb +95 -1
- data/lib/manasimu/data.rb +1 -0
- data/lib/manasimu.rb +1 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 64a18dd83ea6eecd63bcbe76a29b33741331da0134075ccd900ea912d6bacc77
|
4
|
+
data.tar.gz: 8dcd31a698b03e8f3bbe32024e6334380682da40b83f744a38b7ca00a6f43d77
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0524f1549c37058044d8e71286814e5fe866cde702070776eb1f1cac296718202aa5f4360f732ab294849eff52a5d747f82553dd7cc21b8e149c7116ccfdbc6
|
7
|
+
data.tar.gz: ffb6a93dc2e91d7e18fc12d8a4e27f2c544d1637dae859d3a14aa23c577425dfedd54755f374a666f59055dbb4de52b1ff75bfb63d69f1ff47216b5d6c2946b7
|
data/db/card_type_aggregate
CHANGED
Binary file
|
@@ -0,0 +1,251 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'json'
|
3
|
+
require 'net/http'
|
4
|
+
|
5
|
+
API_URL = 'https://api.magicthegathering.io/v1/'
|
6
|
+
HTML_URL = 'https://gatherer.wizards.com/'
|
7
|
+
|
8
|
+
def request_cards(set_code, page)
|
9
|
+
begin
|
10
|
+
uri = URI(API_URL + "cards")
|
11
|
+
params = { page: page, pageSize: 100, set: set_code}
|
12
|
+
uri.query = URI.encode_www_form(params)
|
13
|
+
res = Net::HTTP.get_response(uri)
|
14
|
+
|
15
|
+
if not res.is_a?(Net::HTTPSuccess)
|
16
|
+
puts 'http connection fail'
|
17
|
+
exit
|
18
|
+
end
|
19
|
+
|
20
|
+
JSON.parse(res.body)
|
21
|
+
rescue => ex
|
22
|
+
p ex
|
23
|
+
sleep 30
|
24
|
+
request_cards(set_code, page)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_names(set_code)
|
29
|
+
page = 1
|
30
|
+
ret = []
|
31
|
+
notfounds = []
|
32
|
+
|
33
|
+
ja = 4
|
34
|
+
en = 0
|
35
|
+
|
36
|
+
while true
|
37
|
+
hash = request_cards(set_code, page)
|
38
|
+
|
39
|
+
if hash['cards'].length == 0
|
40
|
+
puts 'last page'
|
41
|
+
break
|
42
|
+
end
|
43
|
+
|
44
|
+
multiverseid_offset = nil
|
45
|
+
multiverseid_change_count = 0
|
46
|
+
ja_index = nil
|
47
|
+
|
48
|
+
unfound_cards = []
|
49
|
+
hash['cards'].each do |card|
|
50
|
+
|
51
|
+
if not card['foreignNames']
|
52
|
+
unfound_cards << card
|
53
|
+
next
|
54
|
+
end
|
55
|
+
|
56
|
+
names = card['foreignNames'].select do |f|
|
57
|
+
f['language'] == "Japanese"
|
58
|
+
end.map do |f|
|
59
|
+
f["name"]
|
60
|
+
end
|
61
|
+
|
62
|
+
ja_index = card['foreignNames'].map do |f|
|
63
|
+
f['language']
|
64
|
+
end.index('Japanese')
|
65
|
+
|
66
|
+
multiverseids = card['foreignNames'].map do |f|
|
67
|
+
f['imageUrl'] =~ /multiverseid=(\d+)&?/
|
68
|
+
$1
|
69
|
+
end
|
70
|
+
|
71
|
+
# to scrape japanese name using multiverse, get multiverse id offset
|
72
|
+
if multiverseids.length > 1
|
73
|
+
offset = multiverseids[1].to_i - multiverseids[0].to_i
|
74
|
+
if multiverseid_offset != offset
|
75
|
+
multiverseid_offset = offset
|
76
|
+
multiverseid_change_count += 1
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
type = create_card_type(card, ret, names)
|
81
|
+
ret = add_cardtypes_to(ret, type)
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
# if foreignNames were not found and multiverseid_offset is fixed
|
86
|
+
if unfound_cards.length > 0 and multiverseid_change_count == 1 and ja_index
|
87
|
+
puts "#{set_code} / #{unfound_cards.length} cards was not found"
|
88
|
+
|
89
|
+
unfound_cards.each do |card|
|
90
|
+
ja_multiverseid = card['multiverseid'].to_i + multiverseid_offset * (ja_index + 1)
|
91
|
+
ja_name = scrape_detail(ja_multiverseid)
|
92
|
+
|
93
|
+
p "#{ja_name}: #{card['name']}"
|
94
|
+
|
95
|
+
names = []
|
96
|
+
if not ja_name.empty?
|
97
|
+
names = [ja_name]
|
98
|
+
else
|
99
|
+
notfounds << [set_code, card['number']]
|
100
|
+
end
|
101
|
+
|
102
|
+
type = create_card_type(card, ret, names)
|
103
|
+
ret = add_cardtypes_to(ret, type)
|
104
|
+
end
|
105
|
+
|
106
|
+
elsif unfound_cards.length > 0
|
107
|
+
puts "invalid multiverseid change #{set_code} : #{unfound_cards.length}"
|
108
|
+
unfound_cards.each do |card|
|
109
|
+
notfounds << [set_code, card['number']]
|
110
|
+
type = create_card_type(card, ret, nil)
|
111
|
+
ret = add_cardtypes_to(ret, type)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
p "#{ret.length}: #{ret.last}"
|
116
|
+
page +=1
|
117
|
+
end
|
118
|
+
|
119
|
+
ret.sort!
|
120
|
+
|
121
|
+
[ret, notfounds]
|
122
|
+
end
|
123
|
+
|
124
|
+
def add_cardtypes_to(card_types, card_type)
|
125
|
+
return card_types if not card_type
|
126
|
+
return card_types if card_types.find do |c|
|
127
|
+
c.number == card_type.number
|
128
|
+
end
|
129
|
+
card_types << card_type
|
130
|
+
card_types
|
131
|
+
end
|
132
|
+
|
133
|
+
def create_card_type(card, ret, names)
|
134
|
+
|
135
|
+
side_a = ret.find do |c|
|
136
|
+
c.number == card['number'].to_i
|
137
|
+
end
|
138
|
+
|
139
|
+
side = ''
|
140
|
+
if side_a
|
141
|
+
side_a.contents[0].side = 'a'
|
142
|
+
side = 'b'
|
143
|
+
end
|
144
|
+
|
145
|
+
type = [
|
146
|
+
{
|
147
|
+
name: card['name'],
|
148
|
+
names: names,
|
149
|
+
number: card['number'],
|
150
|
+
side: side,
|
151
|
+
set_code: card['set'],
|
152
|
+
mana_cost: card['manaCost'],
|
153
|
+
types: card['types'],
|
154
|
+
type: card['type'],
|
155
|
+
text: card['text'],
|
156
|
+
color_identity: card['colorIdentity'],
|
157
|
+
converted_mana_cost: card['cmc'],
|
158
|
+
multiverseid: card['multiverseid'],
|
159
|
+
}
|
160
|
+
]
|
161
|
+
|
162
|
+
if side == ''
|
163
|
+
CardType.new type
|
164
|
+
else
|
165
|
+
side_a.contents << Content.new(type[0])
|
166
|
+
nil
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def request_sets(page)
|
171
|
+
begin
|
172
|
+
params = { page: page, pageSize: 100}
|
173
|
+
uri = URI(API_URL + "sets")
|
174
|
+
uri.query = URI.encode_www_form(params)
|
175
|
+
res = Net::HTTP.get_response(uri)
|
176
|
+
|
177
|
+
if not res.is_a?(Net::HTTPSuccess)
|
178
|
+
puts 'http connection fail'
|
179
|
+
exit
|
180
|
+
end
|
181
|
+
|
182
|
+
JSON.parse(res.body)
|
183
|
+
rescue => ex
|
184
|
+
p ex
|
185
|
+
sleep 30
|
186
|
+
request_json(page)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def get_sets
|
191
|
+
ret = []
|
192
|
+
page = 1
|
193
|
+
while true
|
194
|
+
hash = request_sets(page)
|
195
|
+
|
196
|
+
if hash['sets'].length == 0
|
197
|
+
puts 'last page'
|
198
|
+
break
|
199
|
+
end
|
200
|
+
page += 1
|
201
|
+
|
202
|
+
hash['sets'].each do |set|
|
203
|
+
code = set['code']
|
204
|
+
name = set['name']
|
205
|
+
ret << [code, name]
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
ret.sort! do |a,b| a[0] <=> b[0] end
|
210
|
+
|
211
|
+
ret
|
212
|
+
end
|
213
|
+
|
214
|
+
def scrape_detail(multiverseid)
|
215
|
+
begin
|
216
|
+
ret = `curl -k 'https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=#{multiverseid}&printed=true'`
|
217
|
+
doc = Nokogiri::HTML.parse(ret)
|
218
|
+
doc.xpath("//*[text()[contains(., 'Card Name:')]]/parent::*").css('div.value').to_a.map do |d|
|
219
|
+
d.text.chomp.strip
|
220
|
+
end .join(" // ")
|
221
|
+
rescue => ex
|
222
|
+
puts ex
|
223
|
+
sleep 30
|
224
|
+
scrape_detail(multiverseid)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
def scrape_legalities(multiverseid)
|
229
|
+
begin
|
230
|
+
ret = `curl -k 'https://gatherer.wizards.com/Pages/Card/Printings.aspx?multiverseid=#{multiverseid}'`
|
231
|
+
doc = Nokogiri::HTML.parse(ret)
|
232
|
+
legalities = {}
|
233
|
+
Format.all.each do |format|
|
234
|
+
text = doc.xpath("//*[text()[contains(., '#{format.name}')]]/parent::*/td[position() = 2]").text
|
235
|
+
legality =
|
236
|
+
if text
|
237
|
+
Legality.find(text.chomp.strip.lstrip)
|
238
|
+
else
|
239
|
+
Legality::None
|
240
|
+
end
|
241
|
+
legalities[format] = legality
|
242
|
+
end
|
243
|
+
card_info = CardInfo.new
|
244
|
+
card_info.legalities = legalities
|
245
|
+
card_info
|
246
|
+
rescue => ex
|
247
|
+
puts ex
|
248
|
+
sleep 30
|
249
|
+
scrape_legalities(multiverseid)
|
250
|
+
end
|
251
|
+
end
|
data/lib/manasimu/card.rb
CHANGED
@@ -279,6 +279,10 @@ class CardType
|
|
279
279
|
@contents[0].set_code
|
280
280
|
end
|
281
281
|
|
282
|
+
def multiverseid
|
283
|
+
@contents[0].multiverseid
|
284
|
+
end
|
285
|
+
|
282
286
|
def is_land?(side = nil)
|
283
287
|
return @is_land if @is_land
|
284
288
|
arr = if side == 'a'
|
@@ -459,7 +463,7 @@ class CardTypeAggregate
|
|
459
463
|
end
|
460
464
|
|
461
465
|
class Content
|
462
|
-
attr_accessor :name, :names, :number, :side, :set_code, :mana_cost, :type, :types, :color_identity, :converted_mana_cost, :text
|
466
|
+
attr_accessor :name, :names, :number, :side, :set_code, :mana_cost, :type, :types, :color_identity, :converted_mana_cost, :text, :multiverseid
|
463
467
|
|
464
468
|
def initialize(hash)
|
465
469
|
@name = hash[:name]
|
@@ -473,6 +477,7 @@ class Content
|
|
473
477
|
@text = hash[:text]
|
474
478
|
@color_identity = hash[:color_identity]
|
475
479
|
@converted_mana_cost = hash[:converted_mana_cost].to_i
|
480
|
+
@multiverseid = hash[:multiverseid].to_i
|
476
481
|
end
|
477
482
|
|
478
483
|
def mana_source?
|
@@ -497,12 +502,101 @@ class Content
|
|
497
502
|
text { '#{@text}'}
|
498
503
|
color_identity { '#{@color_identity}'}
|
499
504
|
converted_mana_cost {#{@converted_mana_cost}}
|
505
|
+
converted_mana_cost { #{@multiverseid} }
|
500
506
|
end
|
501
507
|
EOF
|
502
508
|
end
|
503
509
|
|
504
510
|
end
|
505
511
|
|
512
|
+
class CardInfo
|
513
|
+
attr_accessor :legalities, :sets
|
514
|
+
end
|
515
|
+
|
516
|
+
class Legality
|
517
|
+
attr_accessor :name
|
518
|
+
@@legalities = nil
|
519
|
+
|
520
|
+
def initialize(name)
|
521
|
+
@name = name
|
522
|
+
end
|
523
|
+
|
524
|
+
def to_s
|
525
|
+
@name
|
526
|
+
end
|
527
|
+
|
528
|
+
None = Legality.new("Legality")
|
529
|
+
Banned = Legality.new("Banned")
|
530
|
+
Restricted = Legality.new("Restricted")
|
531
|
+
Legal = Legality.new("Legal")
|
532
|
+
|
533
|
+
def self.all
|
534
|
+
return @@legalities if @@legalities
|
535
|
+
@@legalities= [
|
536
|
+
None,
|
537
|
+
Banned,
|
538
|
+
Restricted,
|
539
|
+
Legal,
|
540
|
+
].sort! do |a,b| a.name <=> b.name end
|
541
|
+
end
|
542
|
+
|
543
|
+
def self.find(name)
|
544
|
+
self.all.bsearch do |a|
|
545
|
+
a.name >= name
|
546
|
+
end
|
547
|
+
end
|
548
|
+
|
549
|
+
end
|
550
|
+
|
551
|
+
class Format
|
552
|
+
attr_accessor :name
|
553
|
+
@@formats = nil
|
554
|
+
|
555
|
+
def initialize(name)
|
556
|
+
@name = name
|
557
|
+
end
|
558
|
+
|
559
|
+
def to_s
|
560
|
+
@name
|
561
|
+
end
|
562
|
+
|
563
|
+
Standard = Format.new("Standard")
|
564
|
+
Brawl = Format.new("Brawl")
|
565
|
+
Pioneer = Format .new("Pioneer")
|
566
|
+
Modern = Format .new("Modern")
|
567
|
+
Legacy = Format .new("Legacy")
|
568
|
+
Vintage = Format .new("Vintage")
|
569
|
+
Commander = Format .new("Commander")
|
570
|
+
Pauper = Format .new("Pauper")
|
571
|
+
Historic = Format .new("Historic")
|
572
|
+
Alchemy = Format .new("Alchemy")
|
573
|
+
Explorer = Format .new("Explorer")
|
574
|
+
|
575
|
+
def self.all
|
576
|
+
return @@formats if @@formats
|
577
|
+
@@formats = [
|
578
|
+
Standard ,
|
579
|
+
Brawl ,
|
580
|
+
Pioneer ,
|
581
|
+
Modern ,
|
582
|
+
Legacy ,
|
583
|
+
Vintage ,
|
584
|
+
Commander ,
|
585
|
+
Pauper ,
|
586
|
+
Historic ,
|
587
|
+
Alchemy ,
|
588
|
+
Explorer ,
|
589
|
+
].sort! do |a,b| a.name <=> b.name end
|
590
|
+
end
|
591
|
+
|
592
|
+
def self.find(name)
|
593
|
+
self.all.bsearch do |a|
|
594
|
+
a.name >= name
|
595
|
+
end
|
596
|
+
end
|
597
|
+
|
598
|
+
end
|
599
|
+
|
506
600
|
class FordFulkersonSingleton
|
507
601
|
include Singleton
|
508
602
|
def obj
|
data/lib/manasimu/data.rb
CHANGED
data/lib/manasimu.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: manasimu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.31
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- so1itaryrove
|
@@ -19,6 +19,7 @@ files:
|
|
19
19
|
- db/card_type_aggregate
|
20
20
|
- ext/ford_fulkerson.so
|
21
21
|
- lib/manasimu.rb
|
22
|
+
- lib/manasimu/api_util.rb
|
22
23
|
- lib/manasimu/card.rb
|
23
24
|
- lib/manasimu/card/basicland.rb
|
24
25
|
- lib/manasimu/card/fetchland.rb
|