investigamer / proxyshop Goto Github PK
View Code? Open in Web Editor NEWA Photoshop automation tool for generating high quality Magic the Gathering card renders.
License: Mozilla Public License 2.0
A Photoshop automation tool for generating high quality Magic the Gathering card renders.
License: Mozilla Public License 2.0
Currently the only issue template is "Bug Report".
Might be nice to have a go-to centralized place for people to make feature requests, rather than have all those ideas (both good and bad) float around the chat where they are easily lost or forgotten.
Describe the bug
When i create a custom card and write the Setcode J20 the program won't use the right symbol.
To Reproduce
Steps to reproduce the behavior:
Your system:
Screenshots
If applicable, add screenshots to help explain your problem.
Describe the bug
Python version of v1.1.8 doesn't work due to the missing env.json
Traceback
Traceback (most recent call last):
File "c:/Users/helixvita/Dropbox/mpcproxies/git-helixvita/MTG-Proxyshop/main.py", line 25, in <module>
from proxyshop.creator import CreatorPanels
File "c:\Users\helixvita\Dropbox\mpcproxies\git-helixvita\MTG-Proxyshop\proxyshop\creator.py", line 13, in <module>
from proxyshop import core
File "c:\Users\helixvita\Dropbox\mpcproxies\git-helixvita\MTG-Proxyshop\proxyshop\core.py", line 13, in <module>
from proxyshop import gdown
File "c:\Users\helixvita\Dropbox\mpcproxies\git-helixvita\MTG-Proxyshop\proxyshop\gdown.py", line 23, in <module>
from proxyshop.constants import con
File "c:\Users\helixvita\Dropbox\mpcproxies\git-helixvita\MTG-Proxyshop\proxyshop\constants.py", line 320, in <module>
with open(os.path.join(cwd, "proxyshop/env.json"), "r", encoding="utf-8") as api_keys:
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\helixvita\\Dropbox\\mpcproxies\\git-helixvita\\MTG-Proxyshop\\proxyshop/env.json'
Describe the bug
When trying to render basic lands, they open the template and just stop, no errors or failures but nothing more happens.
To Reproduce
Steps to reproduce the behavior:
Your system:
Screenshots
If applicable, add screenshots to help explain your problem.
Describe the bug
We use this regex to handle identifying an italics ability such as the "Lieutenant —" ability, it works with other situations I've tested but not this one, due to the carriage return that precedes the ability. This code is a slightly refactored version of what's on main branch right now (but the current version produces the same bug)
# Find and add ability words
reg = re.compile(r"([\s\w\-]*?) — ")
for match in reg.findall(card_text):
# Cover boast cards and choose cards that aren't weird AFR cases
match = str(match)
if (
any(s in match for s in ("• ", "Boast"))
and card_text[0:12] != "Choose one —"
): continue
# Fix bullet points and carriage return
if "• " in match:
match = match.replace("• ", "")
if "\r" in match:
match = match.replace("\r", "")
italic_text.append(match)
To Reproduce
Steps to reproduce the behavior:
Try to render "Tyrant's Familiar" for example:
Your system:
Screenshots
See Tyrant's familiar render above
Will be looking into this soon, but if a good regexer wants to beat me to the punch, we basically just need to modify that regex to exclude a leading carriage return (\r)
Describe the bug
Scryfall search is including art cards on the search results and this makes proxyshop discard the search result and throw a "Layout incompatible" error.
To Reproduce
Steps to reproduce the behavior:
Your system:
Describe the bug
Normal Tokens are created with incorrect font sizing on Oracle Text.
To Reproduce
Steps to reproduce the behavior:
Note: during the steps in photoshop, you can see the font starts out correctly sized. There is a step just before Power and Toughness is added that resizes the text. This occurs when using both mm sizing and pixel sizing.
Your system:
When trying to apply the Slime Counter trigger, I received the following:
Game exception occurred: java.lang.NullPointerException
Server version: 1.4.51-V4-beta6 (build: 2022-06-24 13:26)
mage.abilities.effects.common.combat.GoadTargetEffect.apply(GoadTargetEffect.java:60)
mage.abilities.effects.ContinuousEffectImpl.apply(ContinuousEffectImpl.java:115)
mage.abilities.effects.ContinuousEffects.apply(ContinuousEffects.java:1176)
mage.game.GameState.applyEffects(GameState.java:663)
mage.game.GameImpl.applyEffects(GameImpl.java:1747)
mage.game.GameState.processAction(GameState.java:652)
mage.game.GameImpl.checkStateAndTriggered(GameImpl.java:2009)
mage.game.GameImpl.playPriority(GameImpl.java:1513)
mage.game.turn.Step.priority(Step.java:61)
mage.game.turn.Phase.playStep(Phase.java:184)
mage.game.turn.EndPhase.playStep(EndPhase.java:47)
mage.game.turn.Phase.play(Phase.java:89)
mage.game.turn.Turn.play(Turn.java:132)
mage.game.GameImpl.playTurn(GameImpl.java:1042)
mage.game.GameImpl.play(GameImpl.java:952)
mage.game.GameImpl.start(GameImpl.java:928)
mage.server.game.GameWorker.call(GameWorker.java:34)
java.util.concurrent.FutureTask.run(FutureTask.java:266)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
java.lang.Thread.run(Thread.java:748)
Describe the bug
See screenshot. I'm guessing the problem has to do with the "
characters in the cardname.
To Reproduce
Steps to reproduce the behavior:
Attempt to render the card Kongming, "Sleeping Dragon"
with Proxyshop (any template).
Your system:
It would be great if non-python users could have some option to disable the Legendary Crown.
Particularly useful when rendering cards which don't originally have a crown, such the masterpiece.psd template, or really just any pre-Dominaria card.
This can probably be a config only option to keep menu size down but having a way to save named PSD copies of files would help with a lot of processes I'm working on at the moment.
Describe the bug
This seems to be a known issue
Logging this issue in case the workaround described below helps anyone get their setup working. The developers of kivy have acknowledged this issue 10 days ago and are working on a fix.
To Reproduce
Steps to reproduce the behavior:
$ python --version
Python 3.11.0
$ python -m pip install -r requirements.txt
Defaulting to user installation because normal site-packages is not writeable
Collecting photoshop-python-api
Using cached photoshop_python_api-0.19.7-py3-none-any.whl (64 kB)
Collecting Kivy~=2.1.0
Using cached Kivy-2.1.0.tar.gz (23.8 MB)
Installing build dependencies ... error
error: subprocess-exited-with-error
× pip subprocess to install build dependencies did not run successfully.
│ exit code: 1
╰─> [10 lines of output]
Collecting setuptools
Using cached setuptools-65.6.0-py3-none-any.whl (1.2 MB)
Collecting wheel
Using cached wheel-0.38.4-py3-none-any.whl (36 kB)
Collecting cython!=0.27,!=0.27.2,<=0.29.28,>=0.24
Using cached Cython-0.29.28-py2.py3-none-any.whl (983 kB)
Collecting kivy_deps.gstreamer_dev~=0.3.3
Using cached kivy_deps.gstreamer_dev-0.3.3-cp311-cp311-win_amd64.whl (3.9 MB)
ERROR: Could not find a version that satisfies the requirement kivy_deps.sdl2_dev~=0.4.5 (from versions: 0.5.1)
ERROR: No matching distribution found for kivy_deps.sdl2_dev~=0.4.5
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error
× pip subprocess to install build dependencies did not run successfully.
│ exit code: 1
╰─> See above for output.
note: This error originates from a subprocess, and is likely not a problem with pip.
Workaround:
Luckily, there seems to be a temporary workaround to allow use of Python 3.11:
python -m pip install kivy --pre --no-deps --index-url https://kivy.org/downloads/simple/
python -m pip install "kivy[base]" --pre --extra-index-url https://kivy.org/downloads/simple/
Also need to manually install remaining requirements:
Kivy
and asynckivy
from requirements.txt
python -m pip install -r requirements.txt
Your system:
Describe the bug
When "remove reminder text" is on, sagas render with the first ability as the saga reminder text
To Reproduce
Steps to reproduce the behavior:
Your system:
Describe the bug
Unable to install project dependencies (kivy):
Hash for kivy (2.2.0.dev0) from archive Kivy-2.2.0.dev0-cp311-cp311-win_amd64.whl not found in known hashes
To Reproduce
Steps to reproduce the behavior:
poetry install
RuntimeError
while installing kivy
(2.2.0.dev0)Your system:
Screenshots
If applicable, add screenshots to help explain your problem.
Error 401: deleted_client shows up on the page Proxyshop opens when clicking the Update button.
Describe the bug
For alt language cards there is some code that doesn't work right for the Sega Dreamcast Cards
To Reproduce
Steps to reproduce the behavior:
try to render anything from this list https://scryfall.com/sets/psdg
Fix
I took a look at the error and the code and here is what's wrong;
/proxyshop/layouts.py
Starting line 71
# Alternate language? if scryfall['lang'] != "en": self.name_key = 'printed_name' self.oracle_key = 'printed_text' self.type_key = 'printed_type_line' else: self.name_key = 'name' self.oracle_key = 'oracle_text' self.type_key = 'type_line'
For the Dreamcast cards (or any other alt language cards) it still uses "Name" "oracle_text" and "type_line" but doesn't include the "Printed" items in the json.
See theis from the Japanese STA card
https://api.scryfall.com/cards/e5e6d72d-ef92-46b2-853f-003ae6250d30?format=json&pretty=true
Adding an additional check in the if statement that the "Printed_Name" value exists in the JSON should fix this issue as a backup without breaking the intended function of feting alt language text.
This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.
This repository currently has no open or pending branches.
None detected
Describe the bug
The process of saving the output fails when a rendered card has a colon in its name. An empty file with name from the beggining of the card name to the colon is generated instead.
To Reproduce
Steps to reproduce the behavior:
Your system:
Would be cool if Proxyshop was able render cards with the "Miracle" frame effect, such as [[Temporal Mastery]], in much the same way the Normal template is able to render "Nyxtouched" cards.
There are currently only 14 miracle cards (these), but the list keeps growing as new miracles show up in new sets — most recently, The Brother's War.
Tasks:
Describe the bug
Overwriting the new collector_info()
template class method in my own template class (as suggested in the release notes) won't work out of the box since "console" is undefined.
Possible to work around by importing proxyshop.gui.console_handler, but I'm guessing that's not intended (?).
I'm currently working around it by just replacing the line with pass
.
My system:
Proxyglyph (and NDPMTG) fonts are missing the 1,000,000 mana symbol (used in Gleemax card, from unhinged set).
It is available in Andrew Gioia's Mana font though , it may be possible to reuse it from there?
Describe the bug
Using MTG-Proxyshop 1.1.9 and testing the new Plantin MT Pro font. The output shows that on each of the template elements that the font has to be changed to Plantin MT Pro, the font Myriad Pro is chosen instead.
To Reproduce
Steps to reproduce the behavior:
Your system:
Screenshots
If applicable, add screenshots to help explain your problem.
Describe the bug
When rendering a card that has the loyalty counter symbol in its text box, it just renders like [+2] instead of with the little shield/arrow shape. I specifically tried Carth the Lion and Comet, Stellar Pup in the latest versions of the normal and planeswalker extended templates.
Also I'm not sure if it's actually a bug or just not implemented yet but I thought I'd bring attention to it anyway. The correct shape is included in Mana.ttf so I'll use that for now.
To Reproduce
Steps to reproduce the behavior:
Your system:
The link in the README to https://andrewgioia.github.io/Keyrune/cheatsheet.html is a 404
Describe the bug
MDFC card will load scryfall data, then gives "Layout 'modal_dfc' not supported!" error in console.
error.txt: select_frame_layers() missing 1 required positional argument: 'color_indicator'
To Reproduce
Open Proxyshop, select MDFC tab, select Normal, then Render Target. Selected file named "Needleverge Pathway (Piotr Dura) [ZNR].png"
Your system:
Describe the bug
Error on rendering Chandra, Torch of Defiance. "Unable to insert collector info"
03/22/2023 23:55
============================================================================
File "src\templates.py", line 907, in execute
File "src\templates.py", line 435, in collector_info
File "src\templates.py", line 479, in collector_info_authentic
File "src\helpers.py", line 1219, in replace_text
File "photoshop\api\application.py", line 354, in executeAction
File "comtypes\client\lazybind.py", line 182, in caller
File "comtypes\automation.py", line 745, in _invoke
Reason: (-2147023170, 'The remote procedure call failed.', (None, None, None, 0, None))
To Reproduce
Steps to reproduce the behavior:
Your system:
Describe the bug
The cards on the following list https://tagger.scryfall.com/tags/card/banned-due-to-racist-imagery aren't found by the new scryfall search method. Works on 1.1.8.
To Reproduce
Steps to reproduce the behavior:
Your system:
Describe the bug
Whenever i render a card with apostrohopes or quotation marks, Proxyshop always imports the right text from scryfall, but then changes it to german symbols. I changed my system language to english, tried various keyboard layouts, but nothing seems to work.
To Reproduce
Steps to reproduce the behavior:
I don' know if you can reproduce that behaviour.
Your system:
Screenshots
If applicable, add screenshots to help explain your problem.
Describe the bug
No matter which template is used, rendering text fails as screenshotted below.
To Reproduce
Steps to reproduce the behavior:
Render any card with base application templates
I'm happy to run the source code with a debug point in VSCode if I can get a vague sense of where to start
Your system:
Screenshots
If applicable, add screenshots to help explain your problem.
[11/07/2022 23:58] Line: 1107
C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py: align() takes from 0 to 1 positional arguments but 3 were given
[INFO ] [Base ] Start application main loop
File "proxyshop\templates.py", line 239, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1107, in collector_info
psd.align("AdCH", coll_combo, tref); psd.clear_selection()
File "proxyshop\templates.py", line 239, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1107, in collector_info
psd.align("AdCH", coll_combo, tref); psd.clear_selection()
File "proxyshop\templates.py", line 241, in execute
File "proxyshop\text_layers.py", line 143, in execute
File "proxyshop\text_layers.py", line 204, in apply_fill
File "photoshop\api\_document.py", line 83, in activeLayer
File "comtypes\client\lazybind.py", line 218, in __setattr__
File "comtypes\automation.py", line 745, in _invoke
File "proxyshop\templates.py", line 239, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1107, in collector_info
psd.align("AdCH", coll_combo, tref); psd.clear_selection()
[INFO ] [Clipboard ] Provider: winctypes
File "proxyshop\templates.py", line 36, in __init__
File "proxyshop\templates.py", line 110, in load_template
File "photoshop\api\application.py", line 392, in load
File "comtypes\client\lazybind.py", line 182, in caller
File "comtypes\automation.py", line 745, in _invoke
File "main.py", line 219, in render_custom
File "proxyshop\templates.py", line 370, in __init__
File "proxyshop\templates.py", line 281, in __init__
File "proxyshop\templates.py", line 47, in __init__
File "proxyshop\helpers.py", line 78, in getLayerSet
File "photoshop\api\_core.py", line 66, in __getattribute__
File "photoshop\api\application.py", line 63, in activeDocument
File "comtypes\client\lazybind.py", line 168, in __getattr__
File "comtypes\automation.py", line 745, in _invoke
File "proxyshop\templates.py", line 232, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1114, in enable_frame_layers
border_color = self.layout.scryfall['border_color']
File "proxyshop\templates.py", line 232, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1114, in enable_frame_layers
border_color = self.layout.scryfall['border_color']
File "proxyshop\templates.py", line 239, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1107, in collector_info
psd.align("AdCH", coll_combo, tref); psd.clear_selection()
File "proxyshop\templates.py", line 239, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1107, in collector_info
psd.align("AdCH", coll_combo, tref); psd.clear_selection()
[INFO ] [Base ] Start application main loop
File "proxyshop\templates.py", line 239, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1107, in collector_info
psd.align("AdCH", coll_combo, tref); psd.clear_selection()
File "proxyshop\templates.py", line 239, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1107, in collector_info
psd.align("AdCH", coll_combo, tref); psd.clear_selection()
File "proxyshop\templates.py", line 241, in execute
File "proxyshop\text_layers.py", line 143, in execute
File "proxyshop\text_layers.py", line 204, in apply_fill
File "photoshop\api\_document.py", line 83, in activeLayer
File "comtypes\client\lazybind.py", line 218, in __setattr__
File "comtypes\automation.py", line 745, in _invoke
File "proxyshop\templates.py", line 239, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1107, in collector_info
psd.align("AdCH", coll_combo, tref); psd.clear_selection()
[INFO ] [Clipboard ] Provider: winctypes
File "proxyshop\templates.py", line 36, in __init__
File "proxyshop\templates.py", line 110, in load_template
File "photoshop\api\application.py", line 392, in load
File "comtypes\client\lazybind.py", line 182, in caller
File "comtypes\automation.py", line 745, in _invoke
File "main.py", line 219, in render_custom
File "proxyshop\templates.py", line 370, in __init__
File "proxyshop\templates.py", line 281, in __init__
File "proxyshop\templates.py", line 47, in __init__
File "proxyshop\helpers.py", line 78, in getLayerSet
File "photoshop\api\_core.py", line 66, in __getattribute__
File "photoshop\api\application.py", line 63, in activeDocument
File "comtypes\client\lazybind.py", line 168, in __getattr__
File "comtypes\automation.py", line 745, in _invoke
File "proxyshop\templates.py", line 232, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1114, in enable_frame_layers
border_color = self.layout.scryfall['border_color']
File "proxyshop\templates.py", line 232, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1114, in enable_frame_layers
border_color = self.layout.scryfall['border_color']
File "proxyshop\templates.py", line 239, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1107, in collector_info
psd.align("AdCH", coll_combo, tref); psd.clear_selection()
File "proxyshop\templates.py", line 239, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1107, in collector_info
psd.align("AdCH", coll_combo, tref); psd.clear_selection()
[INFO ] [Base ] Start application main loop
File "proxyshop\templates.py", line 239, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1107, in collector_info
psd.align("AdCH", coll_combo, tref); psd.clear_selection()
File "proxyshop\templates.py", line 239, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1107, in collector_info
psd.align("AdCH", coll_combo, tref); psd.clear_selection()
File "proxyshop\templates.py", line 241, in execute
File "proxyshop\text_layers.py", line 143, in execute
File "proxyshop\text_layers.py", line 204, in apply_fill
File "photoshop\api\_document.py", line 83, in activeLayer
File "comtypes\client\lazybind.py", line 218, in __setattr__
File "comtypes\automation.py", line 745, in _invoke
File "proxyshop\templates.py", line 239, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1107, in collector_info
psd.align("AdCH", coll_combo, tref); psd.clear_selection()
[INFO ] [Clipboard ] Provider: winctypes
File "proxyshop\templates.py", line 36, in __init__
File "proxyshop\templates.py", line 110, in load_template
File "photoshop\api\application.py", line 392, in load
File "comtypes\client\lazybind.py", line 182, in caller
File "comtypes\automation.py", line 745, in _invoke
File "main.py", line 219, in render_custom
File "proxyshop\templates.py", line 370, in __init__
File "proxyshop\templates.py", line 281, in __init__
File "proxyshop\templates.py", line 47, in __init__
File "proxyshop\helpers.py", line 78, in getLayerSet
File "photoshop\api\_core.py", line 66, in __getattribute__
File "photoshop\api\application.py", line 63, in activeDocument
File "comtypes\client\lazybind.py", line 168, in __getattr__
File "comtypes\automation.py", line 745, in _invoke
File "proxyshop\templates.py", line 232, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1114, in enable_frame_layers
border_color = self.layout.scryfall['border_color']
File "proxyshop\templates.py", line 232, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1114, in enable_frame_layers
border_color = self.layout.scryfall['border_color']
File "proxyshop\templates.py", line 239, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1107, in collector_info
psd.align("AdCH", coll_combo, tref); psd.clear_selection()
File "proxyshop\templates.py", line 239, in execute
File "C:\Users\anton\Github\Proxyshop.v1.1.6\proxyshop\plugins\FelixVita-Proxyshop-Plugins\templates.py", line 1107, in collector_info
psd.align("AdCH", coll_combo, tref); psd.clear_selection()
File "proxyshop\templates.py", line 241, in execute
File "proxyshop\text_layers.py", line 143, in execute
File "proxyshop\text_layers.py", line 204, in apply_fill
File "photoshop\api\_document.py", line 83, in activeLayer
File "comtypes\client\lazybind.py", line 218, in __setattr__
File "comtypes\automation.py", line 745, in _invoke
Describe the bug
When proxyshop tries to render a Hybrid creature card, it throws the error below. Hybrid non-creature cards do work.
EDIT: It does work with normal template, and it fails on women's day template.
To Reproduce
Steps to reproduce the behavior:
Your system:
Screenshots
Describe the bug
This one's a bit of an edge case, so prioritize accordingly.
To Reproduce
def __init__(self, layout):
super().__init__(layout)
con.font_rules_text = "MPlantin-Bold"
Your system:
Screenshots
Intended effect on left. Proxyshop render on right.
Is your feature request related to a problem? Please describe.
The way I’m testing cards now is by just copy-pasting the exact same test picture, say, 100 times and giving it different names for the cards that I want to test. This is a bit tedious, and it increases the time it takes to develop and test new Proxyshop templates / plugins.
Describe the solution you'd like
I figure at this point it’d make more sense if it was possible to just feed Proxyshop a single txt file (essentially the same kind of "cards.txt" file that MTG-Art-Downloader uses). This would be a lot more simple than having to create 100 identical JPGs with different filenames.
To clarify. I’m not asking for a feature that automatically grabs the correct art from some repo. About 99% of the time I spend with Proxyshop is spent just testing and developing templates, so I don’t care about the art. Thus, as far as I'm concerned, they can all use the exact same sample image, for example the pumpkin patch one used in the test module.
As a bonus, I think having this kind of ability to run a render_all on a simple cards.txt file would make stuff like test-driven development and unit tests much easier. Not only for template creators, but for Proxyshop as a whole.
Just an idea, anyway.
Describe alternatives you've considered
Perhaps it's possible to get this functionality in Proxyshop by just expanding a bit on the functionality of the recently implemented "Dev Mode"? Aside from a few details, it seems pretty close to what I'm describing.
Describe the bug
Asmoranomardicadaistinaculdacar renders as a gold frame card rather than a hybrid color card.
To Reproduce
Try rendering an image named "Asmoranomardicadaistinaculdacar" on any template
Your system:
Happens on all configurations (problem with frame_logic step)
Planning
I've been planning to do a full rework of how the select_frame_layers()
step works in frame_logic.py
, this issue provides a good motivation. As far as I can tell there's no way to cover this case with the parameters passed currently, as just correcting for 2-color hybrid symbol cards with no cost for example would also apply to dual color transform cards like Savage Packmate. The bottom line is, we need to give this step access to more scryfall data. I think it might be best to just pass in the entire scryfall dataset for the card and use what is needed.
I've also considered just rolling the frame logic into the layout object entirely if I can refactor it down enough to make sense. Will investigate more soon.
In the current version of Proxyshop, when fetching card layout info from scryfall, if a user has not explicitly specified the set code in the art file — for example the user has Force of Will.jpg
instead of Force of Will [ALL].jpg
— then Proxyshop will default to picking the latest printing available on scryfall.
If the card has been reprinted in a set that is brand new, then it's possible that the set symbol does not yet exist in Proxyshop. And in this case it will default to using the default "cube" set symbol (or whatever is in the config.ini as the default). Indeed, this is exactly what is currently happening with Force of Will
— it is reprinted in Dominaria United (DMR), which does not yet have its set symbol in Proxyshop. So it defaults to the cube symbol. But in my opinion it would be better to have it default to pretty much any set symbol other than the cube symbol — either 2XM, J14, or ALL.
While I do see how it makes sense for cards rendered with an M15 template (i.e. normal.psd) to default to the latest printing, I would argue this makes less sense as the default behavior for old-school templates like "normal-classic.psd" (or for basically any pre-M15 template). Ideally, the normal-classic template would default to the latest printing prior to 8th edition, if such a printing exists; else earliest printing across all sets
(because 8th is when wotc stopped using the normal-classic frame), However, since I fear that this logic might be a bit too complex, then it's probably simpler to just default to earliest printing across all sets
— call it a a happy compromise.
So, what exactly am I asking for?
Proxyshop template/plugin creator (whose primary interest is in creating templates for old-school and pre-M15 cards),
be able to change the default behavior of Proxyshop from "use latest printing" to "use earliest printing" (ideally by having some parameter I can invoke in, say, the init part of of my custom template class (or anywhere, really),
people who use my template(s) won't be required to manually specify the set for all their cards in order to avoid getting a strange and anachronistic mix like a "Dominaria United" version of a card rendered on an old-school frame (see screenshot below)
Because, if they are using an old-school template to render a card like Force of Will
, then it's quite clear that their intention is to produce an old printing of that card (like Alliances or 2XU); not the Dominaria United version.
File "src\templates.py", line 910, in run_tasks
File "src\templates.py", line 2581, in enable_frame_layers
File "src\helpers.py", line 1571, in content_fill_empty_area
File "photoshop\api_selection.py", line 62, in expand
File "comtypes\client\lazybind.py", line 182, in caller
File "comtypes\automation.py", line 745, in _invoke
Reason: (-2147213497, None, (None, None, None, 0, None))
This bug has been a long existing Photoshop issue, I'm going to track our test cases here and continue developing an elegant long term solution.
Describe the bug
Photoshop crashes when text is inserted that overly exceeds the bounds of a TextLayer paragraph box.
To Reproduce
Try to render Animate Dead for example (as of Proxyshop v1.1.2)
Your system:
This bug occurs regardless of Python or Windows version, and has been demonstrated on all Photoshop versions compatible with Proxyshop.
The Solution:
Previously a solution was added that decreases the font size by .75 if the oracle text being entered is over 300 characters. We now know that for even longer texts such as Animate Dead (420 characters) this number is not enough. As of the developmental Proxyshop (planned 1.1.3 release) I have adjusted this behavior to scale down by 1 pt (EDIT: Increased from .75 to fix Reckoner Bankbuster) for every 100 characters above 200 the text is. This fixes Animated Dead, but we need to continue to catalog known failed cards from the past and ensure this issue is fixed in all cases. I will catalog known bugged cards below and whether this solution solves the issue.
Bugged Cards | Status |
---|---|
Reckoner Bankbuster | Fixed |
Animate Dead | Fixed |
Ao, the Dawn Sky | Fixed |
Eater of Virtue | Fixed |
God-Eternal Kefnet | Fixed |
Lich's Mastery | Fixed |
Toxrill, Corrosive Snail | Fixed |
Bronze Tablet | Likely Fixed |
Giant Oyster | Likely Fixed |
Cooperation | Likely Fixed |
The cards Necron Deathmark and Chaos Defiler from 40K don't properly italicize their ability words
Windows 10
Photoshop 2021
Describe the bug
Typeline scaling fails for all commons which have the "multilayered" (list) structure symbols.json
By "multilayered" structure I don't mean only the sets with actual multiple layers like MID. I'm also talking about single-layer sets like EXO which have their layers in symbols.json formatted as a list rather than a simple string.
By "failure" I don't actually mean that an error is produced. Instead, the scale_text_right_overlap()
returns without doing anything, because reference
is None
. Resulting in a "silent failure" and thus an improperly scaled typeline.
This affects all templates.
Your system:
Screenshots
The bug happens during the scale_text_right_overlap()
function. It returns immediately because reference is None:
One level up in the call stack, we can see that reference
is None here as well:
This bug only happens when rendering cards from sets which have the "multilayered" (list) structure in symbols.json:
Describe the bug
Discord invitation link on README.MD expired
Is your feature request related to a problem? Please describe.
I have edited a template so that the set symbol and collector's information layers are hidden, but those changes aren't honored by Proxyshop because they are always put on visible.
Describe the solution you'd like
I want to be able to hide non-essential parts of a template.
Main solution should be proxyshop honoring layer configuration of the template.
If it is not possible, either having a button on the main program, or being able to change a setting inside the config.ini that you can change to show / hide set symbol and/or collector's information.
Describe alternatives you've considered
None.
Additional context
None.
Latest version, default settings, templates all up to date.
When I try to render for example the default Berg Strider art that comes with the release, this is how the card renders.
This is running on Photoshop CC2015.
That's it.
The name of the virus is Trojan:Win32/Sabsik.EN.D!ml
There are 63 cards in Magic's history which meet this criterion.
Here they are: https://scryfall.com/search?q=-o%3A%2F.%2F+%28s%3Apor+or+s%3Ap02+or+s%3Aptk+or+s%3As99%29+-t%3Abasic
Screenshots
Intended appearance on left, Proxyshop render on right.
Describe the bug
Certain cards, such as [[Bronze Tablet]], cause MTG-Proxyshop to fail to render in such a way that all subsequent cards also fail to render.
To Reproduce
Steps to reproduce the behavior:
Simply attempt to render one of the problem cards. The ones I've found so far are:
If you do "Render Target" it will simply fail.
If you do "Render All" (on some arbitrary collection of art files which includes one of these problem cards), then those cards will render fine until Proxyshop reaches the problem card. It'll fail the same way, but then it will also proceed fail on every subsequent card. I.e. the "Skip Failed Cards" option does not protect against this kind of failure.
Additional observations:
Your system:
Note: I first encountered this using my "Ancient" template on my forked version of Proxyshop, so to be sure it wasn't just an issue with my setup I went ahead and reproduced the issue using a clean version of Proxyshop in a brand new virtual python env.
Screenshots
This gif was captured when I first encountered the problem:
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.