diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml new file mode 100644 index 0000000..4e1ef42 --- /dev/null +++ b/.github/workflows/python-publish.yml @@ -0,0 +1,31 @@ +# This workflows will upload a Python Package using Twine when a release is created +# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries + +name: Upload Python Package + +on: + release: + types: [created] + +jobs: + deploy: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.x' + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install setuptools wheel twine + - name: Build and publish + env: + TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} + TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} + run: | + python setup.py sdist bdist_wheel + twine upload dist/* diff --git a/examples/download_images_by_set.py b/examples/download_images_by_set.py new file mode 100644 index 0000000..1fed785 --- /dev/null +++ b/examples/download_images_by_set.py @@ -0,0 +1,53 @@ +import scrython +import requests +import time + +IMAGE_PATH = './' # You can replace this with whatever path + +def get_set_code(): + all_sets = scrython.sets.Sets() + for i, set_object in enumerate(all_sets.data()): + print(i, all_sets.data(i, "name")) + + choice = int(input("Select your set by number: ")) + + code = all_sets.data(choice, "code") + + return code + +def save_image(path, url, name): + response = requests.get(url) + + with open('{}{}.png'.format(path, name), 'wb') as f: + f.write(response.content) + +def get_all_pages(set_code): + page_count = 1 + all_data = [] + while True: + time.sleep(0.5) + page = scrython.cards.Search(q='e:{}'.format(set_code), page=page_count) + all_data = all_data + page.data() + page_count += 1 + if not page.has_more(): + break + + return all_data + +def get_all_cards(card_array): + card_list = [] + for card in card_array: + time.sleep(0.5) + id_ = card['id'] + card = scrython.cards.Id(id=id_) + card_list.append(card) + + return card_list + +code = get_set_code() +card_list = get_all_pages(code) +card_list_objects = get_all_cards(card_list) + +for card in card_list_objects: + time.sleep(0.1) + save_image(IMAGE_PATH, card.image_uris(0, 'normal'), card.name()) \ No newline at end of file diff --git a/examples/get_all_tokens.py b/examples/get_all_tokens.py new file mode 100644 index 0000000..c416d7b --- /dev/null +++ b/examples/get_all_tokens.py @@ -0,0 +1,56 @@ +import scrython +import time +import json +import os.path +import re + +# This file will parse a scryfall exported deck list and create a list of tokens +# needed for that deck. To run this, make sure that your deck file is in the same folder +# as this. You can then copy/paste the output file back into Scryfall to list all the +# tokens. + +def get_cards(): + with open('scryfall-deck.txt', 'r') as f: + cards_from_file = f.read().splitlines() + + list_of_cards = [] + for name in cards_from_file: + true_name = re.findall(r'[^\d\s//].*', name) + if true_name == ['Commander'] or len(true_name) == 0: + continue + else: + true_name = true_name[0] + + list_of_cards.append(true_name) + + data = { 'data': [] } + + for i, card in enumerate(list_of_cards, start=1): + print('Fetching card: {} | {} of {}'.format(card, i, len(list_of_cards))) + card = scrython.cards.Named(fuzzy=card) + data['data'].append(card.scryfallJson) + time.sleep(0.5) + + with open('scryfall_data.json', 'w+') as f: + f.write(json.dumps(data, sort_keys=True, indent=4)) + +def create_list(): + with open('scryfall_data.json', 'r') as f: + data = json.load(f) + + # Parses through each card in the full json we collected from get_cards + # If the card has the all_parts key, check if it's a token. + # If it is, fetch that token and record it's name and set code + with open('tokens_needed.txt', 'w') as f: + for card in data['data']: + if 'all_parts' in card: + for part in card['all_parts']: + if part['component'] == 'token': + token = scrython.cards.Id(id=part['id']) + time.sleep(0.1) + f.write('{} | {}\n'.format(token.name(), token.set_code())) + +if not os.path.isfile('./scryfall_data.json'): + get_cards() + +create_list() \ No newline at end of file diff --git a/scrython/cards/cards_object.py b/scrython/cards/cards_object.py index d89b8c3..537be94 100644 --- a/scrython/cards/cards_object.py +++ b/scrython/cards/cards_object.py @@ -175,7 +175,8 @@ class CardsObject(FoundationObject): 'emblem': lambda num: self.scryfallJson['image_uris'], 'augment': lambda num: self.scryfallJson['image_uris'], 'host': lambda num: self.scryfallJson['image_uris'], - 'adventure': lambda num: self.scryfallJson['image_uris'] + 'adventure': lambda num: self.scryfallJson['image_uris'], + 'modal_dfc': lambda num: self.scryfallJson['card_faces'][num]['image_uris'] } image_types = { @@ -747,4 +748,4 @@ class CardsObject(FoundationObject): if key in self.scryfallJson['preview']: return self.scryfallJson['preview'][key] - return self.scryfallJson['preview'] \ No newline at end of file + return self.scryfallJson['preview']