LoginSignup
0
0

More than 1 year has passed since last update.

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

Posted at

前回までのあらすじ

MTG Arenaのデッキリストを画像出力するために奮闘するposlogithubであったが、MTG DevelopersGathererのポンコツっぷりを前に苦戦を強いられているんだ!

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

  • mtg-jpのカード・ギャラリーに存在しない。カード個別ページも無い。
  • MTGJSONにも無い。事実上、multiverse_idが不明。
  • 《メイス+2》を含むデッキリストはMTG Arenaでインポートできない。

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

その他

アルケミー

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

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

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

  • カード名の先頭に「A-」が付く。
  • カード番号は調整前後で変わる。
    • 「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

Gloomshrieker
ネオ神河の優良アンコ。

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

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くん???? 仕事して???????

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0