Skip to main content

Magic: the Gathering decklist parser

Project description

mtg-parser

PyPI PyPI - Python Version Github - Latest Release GitHub

mtg_parser is a Python library to download and parse Magic: The Gathering decklists. It supports the MTGO/MTGA formats as well as the most popular deck building websites.

Table of contents

Installation

The following section covers the installation of mtg_parser.

Before using mtg_parser, you will need:

  • python>=3.9

To install mtg_parser, simply run one of the following commands in the terminal of your choice:

$ pip install mtg-parser
# or
$ uv add mtg-parser
# or
$ poetry add mtg-parser

Supported Formats

[!NOTE] mtg_parser has been developed with a primary focus on Commander. While it may function with other formats, compatibility is not guaranteed.

In addition to MTGO and MTGA formats, mtg_parser supports the following websites:

Known issues

Parsing decklists on some websites require specific configuration.

Usage

QuickStart

[!NOTE] As of mtg_parser="=>0.0.1a50" doesn't provide a default http client anymore.

To parse a decklist with mtg_parser, you need to provide an HTTP client that implements a requests compatible interface (such as requests or httpx).

import requests
import mtg_parser

cards = mtg_parser.parse_deck(url, requests.Session())

For conveniency, mtg_parser provides an optional HttpClientFacade to facilitate handling of different websites with different http clients.

import cloudscraper
import httpx
import mtg_parser

client_facade = mtg_parser.HttpClientFacade(httpx.Client(timeout=10.0))
client_facade.set_override('aetherhub.com', cloudscraper.create_scraper())
client_facade.set_override('moxfield.com', httpx.Client(
    timeout=10.0,
    headers={'User-Agent': os.getenv('MOXFIELD_USER_AGENT')},
))

cards = mtg_parser.parse_deck(url, client_facade)

Return format

parse_deck() returns an Iterable[Card] matching the following description

class Card:
    name: str
    quantity: int
    extension: Optional[str]
    number: Optional[str]
    tags: Iterable[str] = []

cards = mtg_parser.parse_deck(url, http_client)
for card in cards:
    print(card)

Parsing MTGO / MTGA

mtg_parser can parse textual decklists in either MTGO or MTGA format

import mtg_parser

decklist = """
    1 Atraxa, Praetors' Voice
    1 Imperial Seal
    1 Lim-Dûl's Vault
    1 Jeweled Lotus (CMR) 319
    1 Llanowar Elves (M12) 182
    3 Brainstorm #Card Advantage #Draw
"""

cards = mtg_parser.parse_deck(deck_list)

Parsing from aetherhub.com

Aetherhub Integration Tests

mtg_parser can parse public decks from aetherhub.com

[!IMPORTANT] aetherhub.com requires a Cloudflare-bypass requests compatible http client such as cloudscraper.

import cloudscraper
import mtg_parser

url = 'https://aetherhub.com/Deck/<deck_name>'

cards = mtg_parser.parse_deck(url, cloudscraper.create_scraper())

Parsing from archidekt.com

Archideckt Integration Tests

mtg_parser can parse public decks from archidekt.com

import requests
import mtg_parser

url = 'https://www.archidekt.com/decks/<deck_id>/'

cards = mtg_parser.parse_deck(url, requests.Session())

Parsing from deckstats.net

Deckstats Integration Tests

mtg_parser can parse public decks from deckstats.net

[!IMPORTANT] deckstats.net requires a Cloudflare-bypass requests compatible http client such as cloudscraper.

import cloudscraper
import mtg_parser

url = 'https://deckstats.net/decks/<user_id>/<deck_id>'

cards = mtg_parser.parse_deck(url, cloudscraper.create_scraper())

Parsing from moxfield.com

Moxfield Integration Tests

mtg_parser can parse public decks from moxfield.com

[!IMPORTANT] Moxfield.com prohibits scraping their website, as it violates their Terms of Service.

For authorized access, please contact support@moxfield.com to request a custom User-Agent.

import httpx
import mtg_parser

url = 'https://www.moxfield.com/decks/<deck_id>'

headers = {'user-agent': '<MOXFIELD_USER_AGENT>'}
with httpx.Client(headers=headers) as http_client:
    cards = mtg_parser.parse_deck(url, http_client)

Parsing from mtggoldfish.com

MTGGoldfish Integration Tests

mtg_parser can parse public decks from mtggoldfish.com

[!IMPORTANT] mtggoldfish.com requires a Cloudflare-bypass requests compatible http client such as cloudscraper.

import cloudscraper
import mtg_parser

url = 'https://www.mtggoldfish.com/deck/<deck_id>'

cards = mtg_parser.parse_deck(url, cloudscraper.create_scraper())

Parsing from mtgjson.com

mtgjson Integration Tests

mtg_parser can parse decks from mtgjson.com

import requests
import mtg_parser

url = 'https://mtgjson.com/api/v5/decks/<deck_name>.json'

cards = mtg_parser.parse_deck(url, requests.Session())

Parsing from mtgvault.com

MTGVault Integration Tests

mtg_parser can parse public decks from mtgvault.com

[!IMPORTANT] mtgvault.com requires a Cloudflare-bypass requests compatible http client such as cloudscraper.

import cloudscraper
import mtg_parser

url = 'https://www.mtgvault.com/<username>/decks/<deck_name>/'

cards = mtg_parser.parse_deck(url, cloudscraper.create_scraper())

Parsing from scryfall.com

Scryfall Integration Tests

mtg_parser can parse public decks from scryfall.com

import requests
import mtg_parser

url = 'https://scryfall.com/<userid>/decks/<deck_id>/'

cards = mtg_parser.parse_deck(url, requests.Session())

Parsing from tappedout.net

Tappedout Integration Tests

mtg_parser can parse public decks from tappedout.net

import requests
import mtg_parser

url = 'https://tappedout.net/mtg-decks/<deck_id>/'

cards = mtg_parser.parse_deck(url, requests.Session())

Parsing from tcgplayer.com

TCGplayer Integration Tests

mtg_parser can parse public decks from either tcgplayer.com or infinite.tcgplayer.com

import requests
import mtg_parser

url = 'https://www.tcgplayer.com/content/magic-the-gathering/deck/<deck_name>/<deck_id>'
# or url = 'https://infinite.tcgplayer.com/magic-the-gathering/deck/<deck_name>/<deck_id>'

cards = mtg_parser.parse_deck(url, requests.Session())

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mtg_parser-0.0.1a54.tar.gz (17.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mtg_parser-0.0.1a54-py3-none-any.whl (22.7 kB view details)

Uploaded Python 3

File details

Details for the file mtg_parser-0.0.1a54.tar.gz.

File metadata

  • Download URL: mtg_parser-0.0.1a54.tar.gz
  • Upload date:
  • Size: 17.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.4 CPython/3.14.4 Darwin/23.5.0

File hashes

Hashes for mtg_parser-0.0.1a54.tar.gz
Algorithm Hash digest
SHA256 9538cfc40ec9e1008e0389f083458adde84ac796c4c7fe44a596102ab17e032a
MD5 ccc864bacd405579030aa65e97d230b4
BLAKE2b-256 0792ec156e709f6296d6aa0d3927ca2c7b928c7f56be911968959c27bd493a5a

See more details on using hashes here.

File details

Details for the file mtg_parser-0.0.1a54-py3-none-any.whl.

File metadata

  • Download URL: mtg_parser-0.0.1a54-py3-none-any.whl
  • Upload date:
  • Size: 22.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.4 CPython/3.14.4 Darwin/23.5.0

File hashes

Hashes for mtg_parser-0.0.1a54-py3-none-any.whl
Algorithm Hash digest
SHA256 bd624655e54c81705df566852de79b3622cf522cbf11cc7d165fcaf2c0ee8624
MD5 133706dac18727643cae08ec045c23a4
BLAKE2b-256 59a377c69189cf3a3b96e7ee449f322d1949a03a23ceb4630d37fa7990ca49ed

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page