Skip to content

Instantly share code, notes, and snippets.

@timhae
Created August 14, 2022 12:13
Show Gist options
  • Save timhae/2487079d0127ffe59f3fd909aa0f1e3f to your computer and use it in GitHub Desktop.
Save timhae/2487079d0127ffe59f3fd909aa0f1e3f to your computer and use it in GitHub Desktop.
download decklist as pdf
#! /usr/bin/env nix-shell
#! nix-shell -i python -p python3 python3Packages.pillow
import os
import time
import json
from PIL import Image
from urllib import request, parse
pdfs = 0
front_pages = []
back_pages = []
for dirpath in [el for el in os.listdir('.') if os.path.isdir(el)]:
print('\n===== downloading images for ' + dirpath)
with open(dirpath + '/deck.txt') as dl:
decklist = dl.readlines()
print('=== maindeck')
for line in decklist:
if '\n' == line:
print('=== sideboard')
continue
name = ' '.join(line.strip().split()[1:])
quantity = int(' '.join(line.strip().split()[0]))
if name in ['Swamp', 'Forest', 'Plains', 'Island', 'Mountain']:
print('= skipping standard land ' + name)
continue
basename = dirpath + '/' + name.replace(' ', '_')
imagename = basename + '.png'
if os.path.isfile(imagename):
pause = 0
print('= skipping already existing image ' + name)
else:
pause = 0.1
print('= downloading ' + name)
url = 'https://api.scryfall.com/cards/named?exact=' + parse.quote(name)
json_response = json.loads(request.urlopen(url).read())
if 'card_faces' in json_response.keys():
uri = json_response['card_faces'][0]['image_uris']['png']
uri_back = json_response['card_faces'][1]['image_uris']['png']
with open(basename + '_back.png', 'wb') as f:
f.write(request.urlopen(uri_back).read())
else:
uri = json_response['image_uris']['png']
with open(imagename, 'wb') as f:
f.write(request.urlopen(uri).read())
x = 750
y = 1050
offset = 36
front = Image.open(imagename).resize((x, y))
front_base = Image.new('RGBA', (x + 2 * offset, y + 2 * offset), (0, 0, 0, 255))
front_rgb = Image.new('RGB', (x + 2 * offset, y + 2 * offset), (0, 0, 0))
front_base.paste(front, box=(offset, offset))
front_rgb.paste(front_base, mask=front_base.split()[3])
if os.path.isfile(basename + '_back.png'):
back = Image.open(basename + '_back.png').resize((x, y))
else:
back = Image.open('back.png').resize((x, y))
back_base = Image.new('RGBA', (x + 2 * offset, y + 2 * offset), (0, 0, 0, 255))
back_rgb = Image.new('RGB', (x + 2 * offset, y + 2 * offset), (0, 0, 0))
back_base.paste(back, box=(offset, offset))
back_rgb.paste(back_base, mask=back_base.split()[3])
for _ in range(quantity):
if len(front_pages) == 54:
front_pages[0].save('front_' + str(pdfs) + '.pdf', save_all=True,
append_images=front_pages[1:] + [front_rgb], resolution=300)
front_pages = []
back_pages[0].save('back_' + str(pdfs) + '.pdf', save_all=True,
append_images=back_pages[1:] + [back_rgb], resolution=300)
back_pages = []
pdfs += 1
else:
front_pages.append(front_rgb)
back_pages.append(back_rgb)
time.sleep(pause)
front_pages[0].save('front_' + str(pdfs) + '.pdf', save_all=True,
append_images=front_pages[1:] + [front_rgb], resolution=300)
back_pages[0].save('back_' + str(pdfs) + '.pdf', save_all=True,
append_images=back_pages[1:] + [back_rgb], resolution=300)
@nicolaibach
Copy link

hallo @timhae, vielen Dank für das Script! Bin jetzt endlich mal dazu gekommen es auszuprobieren und es funktioniert ganz wunderbar.
Hab’ nur noch eine Frage zum eigentlichen Bestellvorgang: Ich vermute, die passende Bestelloption ist 55 Karten im Format 63*88 mm, oder gibt es noch eine bessere?
Grüße aus Berlin

@timhae
Copy link
Author

timhae commented Aug 28, 2022

Moin, jo genau ich hatte hier immer bestellt und dann einfach die 55 Karten mit 63x88 die sind genauso groß wie die Magic Karten.. Ich hatte neulich auch noch das hier gefunden, da kann man größere Packungen mit mehr Karten bestellen und die sind günstiger aber auch minimal größer aber denke das sollte auch passen, hab ich aber noch nicht probiert.

@nicolaibach
Copy link

Besten dank!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment