mtg-sdk-pythonで四苦八苦する②

# [前回](https://qiita.com/poslogithub/items/a23252dd6b7075c5453f)までのあらすじ

[MTG Arena](https://magic.wizards.com/ja/mtgarena)のデッキリストを画像出力するために奮闘するposlogithubであったが、[MTG Developers](https://magicthegathering.io/)と[Gatherer](https://gatherer.wizards.com/Pages/Default.aspx)のポンコツっぷりを前に苦戦を強いられているんだ！

# ここで躓くよmtg-sdk-python

流石にもう問題が起きることは無い。
その考えが《[蜂蜜マンモス](https://mtg-jp.com/products/card-gallery/0000187/479678/)》より甘いことに気づかされるのに、大して時間はかからなかった。

```py
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()    # メイス＋２

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`である。
実は《メイス＋２》は日本語を主言語とするMTG Arena関連ツール開発者にとっては知らない者はいないほどの問題児で、以下のような逸話を持つ。

* [mtg-jpのカード・ギャラリー](https://mtg-jp.com/products/card-gallery/0000213/)に存在しない。カード個別ページも無い。
* [MTGJSON](https://mtgjson.com/)にも無い。事実上、multiverse_idが不明。
* 《メイス＋２》を含むデッキリストはMTG Arenaでインポートできない。

こいつに関しては、もう諦めるしかない。

# その他

## アルケミー

アルケミーで調整されたカードは、デッキリストでは以下の扱いとなる。

* カード名の先頭に「A-」が付く。
* コレクター番号は調整前後で変わらない。

一方、MTG Developersでは以下の扱いとなる。

* カード名の先頭に「A-」が付く。
* カード番号は調整前後で変わる。
  * 「A-n」というセット番号になる（nは調整前のカード番号）
    * カード番号は文字列型ですよ。あれ、言ってませんでしたっけ？

つまり、コレクター番号の先頭に「A-」を付けて検索すればよい。

```py
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
```
まあ、カード画像があるとは限らんのですが。

## 日本語版カード画像はあるのに、カードの日本語名が英語名になっている

```py
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
```
![Gloomshrieker](http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=550055&type=card "Gloomshrieker")
ネオ神河の優良アンコ。

## カード画像のフォーマットは実際のデータから確認すること

[Gatherer](https://gatherer.wizards.com/Pages/Default.aspx)のカード画像のフォーマットは、JPEGとPNGが混在している。
レスポンスヘッダのContent-Typeを見れば判断できるでしょう。
念のために、Pillowでフォーマット確認もしようかな。

```py
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くん？？？？ 仕事して？？？？？？？