見出し画像

令和決定版!ハナクソをほじりながらMTG全カードの画像をDLして仕分ける方法!

※ご注意※
タイトルでお察しとは思いますが、この記事は自分のために書いた備忘録です。その辺了承した上でよろしうお願いします。というか地球上でこんなの必要なのほとんどおらんという前提で書いてます。ハイ。

1.なんで画像が必要やねん

まず冒頭でも書いたが、こんな事態に追い込まれる人は稀だろう。MTGアリーナを遊ぶ、MOを遊ぶ、カードショップで遊ぶ等々、普通のMTGライフを送る上で、「カードの画像」が必要になることなどほとんどないからである。

なので、こんな記事などほとんど価値はないのだが、ごく稀に、「MTGの画像をすべてDLし、それぞれの名前をCSVファイルで仕分け、かつLivestream Overlay Managerなどのオーバーレイ管理ソフトで運用できるようにする必要がある」という人種がいる。ただ、MTG社会はそんな前提で動いていないので、どこを探してもこんな情報は出てくることはない。

▲何のことかわからん?この右上だよ右上!

今回はそんな状況に苦しむ皆様というか情報を散逸させて死にそうな目に合った筆者のために、楽々ちんちんにMTGの画像を管理する方法を書いておこうと思う。

2.MTGの画像をダウンロードする方法

以前筆者はなんかの記事でこう書いた記憶がある。

現状いまだに公式のサイトからダウンロードした画像の名前付けは手作業で行っている段階である。これについては何かいい手段はないだろうかと思う次第である。

「マッサンのLivestream Overlay Manager奮闘記」より

結論から言おう。こんなこと(手作業DL)していると死ぬ。一応、筆者が使っているGoogle Chromeのアドオンで画像一括ダウンロードを可能にしたのだが、どの画像にも適当な名前が割り振られており、それでいちいち名前を手作業で変更していたら心が壊れそうになった。いわばIT賽の河原である。

一応旧枠(4版~スカージ)に該当するカードはすべて仕分けたのだが、明らかに体調が悪くなりこれ以上の作業を拒んだため、あとは適当によく見かけるカードをピックアップしてダウンロードし、二度とこういう作業はしないと心に誓っていた。

だが、世の中にはすごいことを考える人がいる。なんと、「MTGのカードの画像を自動でダウンロードして」「名前を勝手に割り振ってくれる」という夢のようなツールを作ってくれた人がいる。それがこの、通称「けんだま砲」である。

# -*- coding: utf-8 -*-

from mtgsdk import Card
from mtgsdk import Set
import urllib
import codecs
import os

# DL完了したエキスパンションのログ残す用の.txtを作る
logfile = codecs.open( 'log2.log', 'a', 'utf-8' )
#スキップするエキスパンション
skiplist = ["10E","F01"]

sets = Set.all()

for s in sets:
    logfile = codecs.open( 'log2.log', 'a', 'utf-8' )
    code = s.code
    if code in skiplist:
        print("skip"+ code)
    else:    
        cards = Card.where(set=code).all()
    
        if code == 'CON':
            code = 'CONF'
         
        try:
            os.mkdir(code)
        except:
            print(code, 'は存在するディレクトリです')
        
        os.chdir('./'+ code)
            
        for card in cards:
            DL = "False"
            try:
                for lngs in card.foreign_names:
                    lng = lngs['language']
                    if lng == "Japanese":
                        neme = card.name
                        imageUrlRequest = urllib.request.urlopen( lngs['imageUrl'] )
                        imageData = imageUrlRequest.read()
                        outFilename = lngs['name'] + ".png"
                        outFilename = outFilename.replace( '\"', '@', 2 )
                        outFilename = outFilename.replace( ':', '__', 2 )	
                        outputFile = open( outFilename, "wb" )
                        outputFile.write( imageData )
                        outputFile.close()
                        DL = "True"
            except:
                try:
                    imageUrlRequest = urllib.request.urlopen( card.image_url )
                    imageData = imageUrlRequest.read()
                    outFilename = card.name + ".png"
                    outFilename = outFilename.replace( '\"', '@', 2 )
                    outFilename = outFilename.replace( ':', '__', 2 )	
                    outputFile = open( outFilename, "wb" )
                    outputFile.write( imageData )
                    outputFile.close()
                    DL = "True"
                except:    
                    continue
                
            if DL == "False":
                try:
                      imageUrlRequest = urllib.request.urlopen( card.image_url )
                      imageData = imageUrlRequest.read()
                      outFilename = card.name + ".png"
                      outFilename = outFilename.replace( '\"', '@', 2 )
                      outFilename = outFilename.replace( ':', '__', 2 )	
                      outputFile = open( outFilename, "wb" )
                      outputFile.write( imageData )
                      outputFile.close()
                      DL = "True"
                except:    
                      print(card.name)
                      continue
        
            
        os.chdir('../')
        logfile.write( '"' + code + '",')
        logfile.close()

これをパイソンが実行できる環境で実行するとあら不思議、勝手に画像を収集して名前を割り振ってつけてくれる。パイソンについては筆者はズブの素人なので、皆様で調べて実装してください。知らんけど。筆者はこの砲を作ったけんだま大師匠様に教えを請いました。

▲実行して10時間くらい放置すると、各エキスパンションに割り振って画像を保存してくれる
▲えっ?!今日はこんなクソ作業を手作業でしなくていいのか!?

後は、各フォルダで生成された画像を一個のフォルダに突っ込めばOKだ。流石にこれは手作業で大丈夫な仕事量だと思う(まだやってないので不明)

(2023/01/30追記)

遂に上記のけんだま砲を過去にする超クッソ激烈に便利なツールが開発された模様。ただしけんだま砲はけんだま砲で放置してるだけで全てのエキスパンションをダウンロードできるという強みがあるので使い分けるといいと思います。

3.全部画像をフォルダにぶち込んだら

これをLivestream Overlay Managerで使うためには、さらに一つのフォルダに突っ込み、さらにこれを管理するためのCSVファイルを生成すればOKだ。ただ、10000枚オーバーのカード画像のCSVファイルを手作業で生成すると死んでしまうので、ここも楽しよう。Windowsに備わっているWindows PowerShellを使えば楽にできる。

①画像を保存したフォルダ上でShiftキーを押しながら右クリックし、「PowerShell ウィンドウをここで開く」を選択

▲上から7段目のコマンド

②以下のコマンドを打ちこみ実行

Get-ChildItem -recurse -name | Out-File -LiteralPath .\FileList.txt
▲コマンドをコピペしてEnterでシュウウウーッ!!

③生成された「FileList.txt」テキストファイルをCSVファイルに置き換える。単純に拡張子を「FileList.csv」にするだけで対処可能。

▲これが
▲こうなる

ぶっちゃけこのままでも運用は可能だが、見た目上拡張子が邪魔+1行目のカードが認識されないので、エクセルの機能で拡張子を消し、行を1行追加する。

▲このままだとアレなので
▲こうする。1行目の名前は何でもいい。なんなら「ChimPow」でもいい。

4.終わりに

以上、アホほど雑過ぎる画像管理+CSVファイル生成の説明、いかがでしたでしょうか。なんか質問あったら筆者のTwitterかなんかにDMぶん投げてください。色々答えられる範囲で答えます。というかこんな作業やらん方がええよ。ホンマに。

よかったらサポートして頂けると幸いです。MTGアリーナの活動などに充てたいと思います。