Example #1
0
    def __init__(self, name: str = None, session: cdl.CardDownloader = None):
        self.name = name
        self.first_line = False

        if session is None:
            session = cdl.CardDownloader()
        self.session = session
def get_image(card: card.Card,
              output_directory: str,
              session: card_dl.CardDownloader = None) -> str:
    os.makedirs(output_directory, exist_ok=True)
    outname = name_to_fname(card.name)
    try:
        if card.edition:
            if card.collectors_number is not None:
                ex = r"\[{0},{1}\]".format(card.edition,
                                           card.collectors_number)
            else:
                ex = r"\[{0}(,\d+)?\]".format(card.edition)
        else:
            ex = r"(\[[^]]+?\])?"
        prog = re.compile(outname + ex, flags=re.IGNORECASE)
        existing_fname = next(
            f for f in os.listdir(output_directory)
            if os.path.isfile(os.path.join(output_directory, f))
            and prog.fullmatch(os.path.splitext(f)[0]))
        logger.debug("Using existing file \"{0}\"".format(existing_fname))
        return existing_fname
    except StopIteration:
        if session is None:
            session = card_dl.CardDownloader()
        return download_card_image(card, output_directory, session)
Example #3
0
def save_xmage(outstream: typing.TextIO,
               mainboard: CardListTy,
               sideboard: CardListTy,
               name: str = None) -> None:
    session = cdl.CardDownloader()
    newmainboard = ((_check_and_force_edition_num(c, session), n)
                    for c, n in mainboard)
    newsideboard = ((_check_and_force_edition_num(c, session), n)
                    for c, n in sideboard)
    if not name:
        name = os.path.splitext(os.path.split(outstream.name)[-1])[0]
    card_processor = WriteHandleXMageLine(name)
    save_file(outstream, newmainboard, newsideboard, card_processor)
Example #4
0
def make_fully_qualified_card(name: AnyStr = None,
                              edition: AnyStr = None,
                              collectors_number: str = None,
                              language: AnyStr = None,
                              session: card_dl.CardDownloader = None) -> Card:
    if name is None and (edition is None or collectors_number is None):
        raise ValueError("bad inputs")
    if session is None:
        session = card_dl.CardDownloader()
    if language is None and name is None:
        language = "en"
    if edition is not None:
        edition = get_mtgset_codes().get(edition, edition)
    analyzer = session.make_html_analyzer(name, edition, collectors_number,
                                          language)
    return make_fully_qualified_card_from_info(analyzer)
Example #5
0
def force_edition_and_number_copy(card: Card,
                                  session: card_dl.CardDownloader = None
                                  ) -> Card:
    if session is None:
        session = card_dl.CardDownloader()
    analyzer = session.make_html_analyzer(
        card.name, card.edition, next(card.magiccards_info_number_list()),
        card.language)
    edition = card.edition
    num = card.collectors_number
    language = card.language
    parts = card.card_side_num
    if not edition or not num:
        url = next(analyzer.find_card_urls())
        edition, language, num, other_part = card_dl.analyse_hyperref(url)

    return Card(analyzer.get_main_name(), edition, num, language, parts)
Example #6
0
def build_proxies(settings):
    if settings.inventory is not None:

        def inline_load(i):
            tdeck = deck.Deck()
            tdeck.guarded_load(i, settings.inventory_readfunc)
            return tdeck

        all_inv = [inline_load(i) for i in settings.inventory]
        combined_inv = sum(all_inv)
    else:
        combined_inv = deck.Deck()

    dck = deck.Deck()
    dck.guarded_load(settings.input, settings.readfunc)
    if settings.alldecks is None:
        other_decks = []
    else:
        other_decks = load_existing_decks(dck, settings.alldecks,
                                          settings.alldecks_readfunc)
    logger.info("Removing existing decks from inventory")
    for i, d in enumerate(other_decks):
        if not settings.specific_edition:
            d = deck.Deck(*d.remove_version())
        if not settings.include_basics:
            d = deck.remove_basic_lands(d)
        other_decks[i] = d
    from collections import Counter
    c = Counter()
    for other_deck in other_decks:
        c += other_deck.full_deck
    combined_other_deck = deck.Deck(c)
    combined_inv = deck.exclude_deck_from_inventory(combined_inv,
                                                    combined_other_deck)

    if not settings.specific_edition:
        dck = deck.Deck(*dck.remove_version())

    if not settings.include_basics:
        proxies = deck.remove_basic_lands(dck)
    else:
        proxies = dck
    logger.info("Removing remaining inventory from input deck")

    proxies = deck.exclude_inventory_from_deck(proxies, combined_inv)

    logger.info(verbose_msg="PROXY LIST")
    logger.info(verbose_msg=str(proxies))
    session = cdl.CardDownloader()
    image_fnames = imd.get_all_images(proxies, settings.figures, session)
    rel_fig_dir = os.path.relpath(settings.figures,
                                  os.path.dirname(settings.output))
    if rel_fig_dir == ".":
        rel_fig_dir = ""
    proxies.output_latex_proxies(settings.output,
                                 image_fnames,
                                 rel_fig_dir,
                                 settings.template,
                                 mypaper=settings.paper,
                                 cut_color=settings.cutcol,
                                 cut_thickness=settings.cutthick,
                                 card_dimensions=None,
                                 background_colour=settings.background)
    tdeck = deck.exclude_inventory_from_deck(dck, proxies)
    logger.info("--- Already owned cards ---")
    logger.info(tdeck)