前回までのあらすじ
MTG Arenaのデッキリストを画像出力するために奮闘するposlogithubであったが、MTG DevelopersとGathererのポンコツっぷりを前に苦戦を強いられているんだ!
ここで躓くよmtg-sdk-python
流石にもう問題が起きることは無い。
その考えが《蜂蜜マンモス》より甘いことに気づかされるのに、大して時間はかからなかった。
from hashlib import md5
from urllib.request import urlopen
from mtgsdk import Card
CARD_BACK_IMAGE_MD5 = 'db0c48db407a907c16ade38de048a441'
cards = Card.where(set='AFR').where(number=1).all() # メイス+2
name = None
image_url = None
for card in cards:
if card.foreign_names:
for foreign_name in card.foreign_names:
if foreign_name['language'] == 'Japanese':
image_url = foreign_name['imageUrl']
if image_url:
with urlopen(url=image_url) as response:
image_data = response.read()
if md5(image_data).hexdigest() != CARD_BACK_IMAGE_MD5:
name = foreign_name['name']
else:
image_url = None
break
if image_url is None:
name = card.name
image_url = card.image_url
if image_url:
break
print(name, card.set, card.number, image_url)
+2 Mace AFR 1 None
は~~~~~???
英語版カード画像すら無いカードが存在する
card.image_url
もcard.multiverse_id
もNone
である。
実は《メイス+2》は日本語を主言語とするMTG Arena関連ツール開発者にとっては知らない者はいないほどの問題児で、以下のような逸話を持つ。
- mtg-jpのカード・ギャラリーに存在しない。カード個別ページも無い。
- MTGJSONにも無い。事実上、multiverse_idが不明。
- 《メイス+2》を含むデッキリストはMTG Arenaでインポートできない。
こいつに関しては、もう諦めるしかない。
その他
アルケミー
アルケミーで調整されたカードは、デッキリストでは以下の扱いとなる。
- カード名の先頭に「A-」が付く。
- コレクター番号は調整前後で変わらない。
一方、MTG Developersでは以下の扱いとなる。
- カード名の先頭に「A-」が付く。
- カード番号は調整前後で変わる。
- 「A-n」というセット番号になる(nは調整前のカード番号)
- カード番号は文字列型ですよ。あれ、言ってませんでしたっけ?
- 「A-n」というセット番号になる(nは調整前のカード番号)
つまり、コレクター番号の先頭に「A-」を付けて検索すればよい。
from hashlib import md5
from urllib.request import urlopen
from mtgsdk import Card
CARD_BACK_IMAGE_MD5 = 'db0c48db407a907c16ade38de048a441'
cards = Card.where(set='STX').where(number='A-41').all() # A-ゼロ除算
name = None
image_url = None
for card in cards:
if card.foreign_names:
for foreign_name in card.foreign_names:
if foreign_name['language'] == 'Japanese':
image_url = foreign_name['imageUrl']
if image_url:
with urlopen(url=image_url) as response:
image_data = response.read()
if md5(image_data).hexdigest() != CARD_BACK_IMAGE_MD5:
name = foreign_name['name']
else:
image_url = None
break
if image_url is None:
name = card.name
image_url = card.image_url
if image_url:
break
print(name, card.set, card.number, image_url)
A-Divide by Zero STX A-41 None
まあ、カード画像があるとは限らんのですが。
日本語版カード画像はあるのに、カードの日本語名が英語名になっている
from hashlib import md5
from urllib.request import urlopen
from mtgsdk import Card
CARD_BACK_IMAGE_MD5 = 'db0c48db407a907c16ade38de048a441'
cards = Card.where(set='NEO').where(number=219).all() # 闇叫び
name = None
image_url = None
for card in cards:
if card.foreign_names:
for foreign_name in card.foreign_names:
if foreign_name['language'] == 'Japanese':
image_url = foreign_name['imageUrl']
if image_url:
with urlopen(url=image_url) as response:
image_data = response.read()
if md5(image_data).hexdigest() != CARD_BACK_IMAGE_MD5:
name = foreign_name['name']
else:
image_url = None
break
if image_url is None:
name = card.name
image_url = card.image_url
if image_url:
break
print(name, card.set, card.number, image_url)
Gloomshrieker NEO 219 http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=550055&type=card
カード画像のフォーマットは実際のデータから確認すること
Gathererのカード画像のフォーマットは、JPEGとPNGが混在している。
レスポンスヘッダのContent-Typeを見れば判断できるでしょう。
念のために、Pillowでフォーマット確認もしようかな。
from hashlib import md5
from urllib.request import urlopen
from mtgsdk import Card
from PIL import Image
from io import BytesIO
CARD_BACK_IMAGE_MD5 = 'db0c48db407a907c16ade38de048a441'
cards = Card.where(set='NEO').where(number=226).all() # 漆月魁渡
name = None
image_url = None
for card in cards:
if card.foreign_names:
for foreign_name in card.foreign_names:
if foreign_name['language'] == 'Japanese':
image_url = foreign_name['imageUrl']
if image_url:
with urlopen(url=image_url) as response:
image_data = response.read()
content_type = response.info()['Content-Type']
format = Image.open(BytesIO(image_data)).format
print('Content-Type: '+content_type)
print('Format: '+format)
if md5(image_data).hexdigest() != CARD_BACK_IMAGE_MD5:
name = foreign_name['name']
else:
image_url = None
break
if image_url is None:
name = card.name
image_url = card.image_url
if image_url:
break
print(name, card.set, card.number, image_url)
Content-Type: image/jpeg
Format: PNG
漆月魁渡 NEO 226 http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=550063&type=card
Gathererくん???? 仕事して???????