{"id":1481,"date":"2020-06-14T11:10:14","date_gmt":"2020-06-14T11:10:14","guid":{"rendered":"https:\/\/oursoide.wordpress.com\/?p=1481"},"modified":"2020-06-14T11:10:14","modified_gmt":"2020-06-14T11:10:14","slug":"cockatrice-en-francais","status":"publish","type":"post","link":"https:\/\/blog.nanuq.me\/?p=1481","title":{"rendered":"[ARCHIVE] Cockatrice en Fran\u00e7ais (avec un Python)"},"content":{"rendered":"<p><em>\ud83d\uddd3\ufe0f Note : Cet article est une archive import\u00e9e de mon ancien blog. Certaines informations peuvent ne plus \u00eatre \u00e0 jour.<\/em><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Ou comment faire du traitement par lot afin de r\u00e9cup\u00e9rer toutes les cartes de Magic en Fran\u00e7ais ; tout en apprenant, et en s&rsquo;amusant sur un cas pratique. Le tout, d\u00e9taill\u00e9 afin d&rsquo;expliquer la d\u00e9marche et de vous permettre de hacker ce mode op\u00e9ratoire afin de l&rsquo;appliquer \u00e0 d&rsquo;autres objectifs.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:more --><\/p>\n<p><!--more--><\/p>\n<p><!-- \/wp:more --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Si vous voulez la r\u00e9ponse courte, allez directement \u00e0 la conclusion \ud83d\ude42<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:heading {\"level\":1} --><\/p>\n<h1>Introduction<\/h1>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Dans mon<a href=\"https:\/\/blog.nanuq.me\/2020\/06\/13\/jouer-a-magic-avec-cockatrice\/\"> dernier article<\/a>, je vous parlais de <a href=\"https:\/\/cockatrice.github.io\/\">Cockatrice<\/a>. Ce logiciel permettant de jouer (entre autre) \u00e0 Magic en ligne et d&rsquo;acc\u00e9der \u00e0 toutes les r\u00e9f\u00e9rences de cartes possibles. Avant de conclure, je vous expliquais qu&rsquo;on pouvait mettre les cartes en fran\u00e7ais&#8230; Enfin, une partie seulement. Voyons ensemble comment on peut faire pour obtenir <strong>toutes<\/strong> les cartes en fran\u00e7ais. N\u00e9anmoins avant d&rsquo;aller plus loin, je tiens \u00e0 pr\u00e9ciser plusieurs points :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:list --><\/p>\n<ul>\n<li>Je ne suis pas d\u00e9veloppeur. Je fais un peu de code des fois pour rigoler sur mon temps libre ; mais disons que je code avec les pieds. J&rsquo;ai pas mal bidouill\u00e9 avec le langage VBA sur Excel. Autant dire : c&rsquo;est pas glorieux.<\/li>\n<li>Par la suite, on va utiliser Python. En gros tout ce que j&rsquo;ai fait avec Python c&rsquo;est un <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Hello_world\" target=\"_blank\" rel=\"noopener\">\u00ab\u00a0Hello World\u00a0\u00bb<\/a> il y a 5 ans&#8230;<\/li>\n<li>J&rsquo;imagine qu&rsquo;il y a plein d&rsquo;autres moyens d&rsquo;arriver au r\u00e9sultat final. C&rsquo;est une fa\u00e7on de faire, c&rsquo;est certainement pas la meilleure.<\/li>\n<li>Je suis peut \u00eatre en train de r\u00e9inventer la roue. Il est fort\u00a0 probable qu&rsquo;il existe d\u00e9j\u00e0 une solution quelquepart sur les internets pour r\u00e9cup\u00e9rer toutes les cartes en fran\u00e7ais. En r\u00e9alit\u00e9, le r\u00e9sultat final m&rsquo;importe peu. Ce que je souhaite c&rsquo;est d&rsquo;une part la satisfaction de l&rsquo;avoir fait moi m\u00eame ; et d&rsquo;autre part, d&rsquo;expliquer comment j&rsquo;y suis parvenu.<\/li>\n<li>J&rsquo;ai voulu \u00e9galement retranscrire les m\u00e9andres du processus. Les petits <em>fails<\/em>, les fois o\u00f9 je m&rsquo;engage dans une mauvaise route. Je trouve \u00e7a particuli\u00e8rement pertinent de voir les erreurs et s&rsquo;am\u00e9liorer.<\/li>\n<li>J\u2019esp\u00e8re que cet article vous apprendra des choses, et vous donnera des id\u00e9es pour d&rsquo;autres projets. N&rsquo;h\u00e9sitez pas \u00e0 d\u00e9tourner son utilit\u00e9 premi\u00e8re pour arriver \u00e0 d&rsquo;autres fins.<\/li>\n<\/ul>\n<p><!-- \/wp:list --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1488} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/anthony-choren-lyzap0eubdy-unsplash-scaled-1.jpg\"><img decoding=\"async\" class=\"wp-image-1488\" title=\"\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/anthony-choren-lyzap0eubdy-unsplash-scaled-1.jpg?w=300\" alt=\"\"><\/a><figcaption>Photo by Anthony Choren on Unsplash<\/figcaption><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:heading {\"level\":1} --><\/p>\n<h1>La d\u00e9marche<\/h1>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>Rappel<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p><em>\u00a0<\/em>Dans l<a href=\"https:\/\/blog.nanuq.me\/2020\/06\/13\/jouer-a-magic-avec-cockatrice\/\">&lsquo;\u00e9pisode pr\u00e9c\u00e9dent<\/a>, (je vous invite \u00e0 aller le lire d&rsquo;ailleurs) on avait vu qu&rsquo;on pouvait modifier la base de donn\u00e9e de Cockatrice, en lui demandant d&rsquo;aller chercher les cartes dans la langue du client.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1470} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/cocka3-10-1-1.png\"><img decoding=\"async\" class=\"wp-image-1470\" title=\"\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/cocka3-10-1-1.png?w=670\" alt=\"\"><\/a><figcaption>Pour rappel, voici le menu dans lequel on pouvait param\u00e9trer les URL de t\u00e9l\u00e9chargement des illustrations des cartes.<\/figcaption><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Je vous avais alors dit qu&rsquo;il fallait retirer les liens par d\u00e9faut et le remplacer avec ce lien ci :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:quote --><\/p>\n<blockquote class=\"wp-block-quote\"><p>https:\/\/api.scryfall.com\/cards\/!setcode_lower!\/!set:num!\/!sflang!?format=image&amp;face=!prop:side!<\/p><\/blockquote>\n<p><!-- \/wp:quote --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>Comment j&rsquo;avais fait ?<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Seulement voil\u00e0, vous vous doutez bien que j&rsquo;ai pas sorti \u00e7a de mon chapeau magique. Pour d\u00e9couvrir ce lien, j&rsquo;ai farfouill\u00e9 un peu. Sur le screenshot ci dessus, \u00e0 gauche du rep\u00e8re [1] il y\u00a0 a un lien : <a href=\"https:\/\/github.com\/Cockatrice\/Cockatrice\/wiki\/Custom-Picture-Download-URLs\" target=\"_blank\" rel=\"noopener\"><em><strong>\u00ab\u00a0Comment ajouter une URL personnalis\u00e9e\u00a0\u00bb<\/strong><\/em><\/a> (Oui il est bleu fonc\u00e9 sur anthracite, c&rsquo;est pas tr\u00e8s lisible je vous l&rsquo;accorde).<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1498,\"linkDestination\":\"custom\"} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog1-1-1.png\"><img decoding=\"async\" class=\"wp-image-1498\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog1-1-1.png\" alt=\"\"><\/a><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>On arrive sur le github de Cockatrice (en anglais). On y apprend que l&rsquo;on peut modifier les liens avec quelques param\u00e9tres. Celui qui nous int\u00e9resse le plus est le suivant :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:quote --><\/p>\n<blockquote class=\"wp-block-quote\"><p><em><strong>!sflang!<\/strong> \u2192 Language shorthand for scryfall according to current language setting, languages that lack localized card images will default to English.<\/em><\/p><\/blockquote>\n<p><!-- \/wp:quote --><\/p>\n<p><!-- wp:quote --><\/p>\n<blockquote class=\"wp-block-quote\"><p><em>Examples: <code>en<\/code>, <\/em><code><em>zhs<\/em><\/code><\/p><\/blockquote>\n<p><!-- \/wp:quote --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p><strong>Traduction : <\/strong><em>Abr\u00e9viation de scryfall selon le r\u00e9glage de la langue actuelle, les langues qui n&rsquo;ont pas d&rsquo;images de carte localis\u00e9es seront par d\u00e9faut l&rsquo;anglais.\u00a0<\/em><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Bon, je comprends pas tout, mais ca parle de langues, de cartes par d\u00e9faut en anglais&#8230; Ca sent bon tout \u00e7a ! Si on continue de scroller sur cette page on arrive \u00e0 quelques exemples d&rsquo;URL, et un \u00e0 particuli\u00e8rement retenu mon attention !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:quote --><\/p>\n<blockquote class=\"wp-block-quote\"><p><em><code>https:\/\/api.scryfall.com\/cards\/!setcode_lower!\/!set:num!\/!sflang!?format=image&amp;face=!prop:side!<\/code><\/em><br>\n<em>Searches for the setcode and setnumber together with the language, fetches an image in the currently used client language.<\/em><\/p>\n<p><em>The <code>!sflang!<\/code> property can also be manually exchanged for a <a href=\"https:\/\/scryfall.com\/docs\/api\/languages\" rel=\"nofollow\">supported language code<\/a>, e.g. <code>en<\/code> or <code>ja<\/code>, to separate it from the current language setting.<\/em><\/p><\/blockquote>\n<p><!-- \/wp:quote --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p><strong>Traduction : <\/strong><em>Recherche le <strong>setcode<\/strong> et le <strong>setnumber<\/strong> ainsi que la langue, recherche une image dans la langue du client actuellement utilis\u00e9e. La propri\u00e9t\u00e9 <strong>!sflang !<\/strong> peut \u00e9galement \u00eatre \u00e9chang\u00e9e manuellement contre un code de langue pris en charge, par exemple en ou ja, pour le s\u00e9parer du param\u00e8tre de langue actuel.<\/em><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Vous reconnaissez le lien qu&rsquo;ils donnent en exemple ? C&rsquo;est lui qu&rsquo;il faut rentrer dans le logiciel ! C&rsquo;est comme \u00e7a que je l&rsquo;ai trouv\u00e9. Nous, notre logiciel est en fran\u00e7ais, on va garder le param\u00e9trage par d\u00e9faut et on va pas s&#8217;emb\u00eater \u00e0 manuellement changer la langue.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>Pourquoi tout n&rsquo;est pas traduit ?<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Bon, ensuite je me suis demand\u00e9 <em>\u00ab\u00a0Mais pourquoi on a pas toutes les cartes en fran\u00e7ais ?\u00a0\u00bb . <\/em> Rappelez vous de ce qu&rsquo;on vient de voir ci dessus, j&rsquo;ai cliqu\u00e9 sur le lien qu&rsquo;ils donnaient dans les exemples : \u00ab\u00a0<em><a href=\"https:\/\/scryfall.com\/docs\/api\/languages\" rel=\"nofollow\">supported language code<\/a><\/em>\u00ab\u00a0.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1499,\"linkDestination\":\"custom\"} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog2-1-1.png\"><img decoding=\"async\" class=\"wp-image-1499\" title=\"\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog2-1-1.png?w=670\" alt=\"\"><\/a><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>On arrive sur le site de <strong>Scryfall<\/strong>. Et on apprend tout un tas de chose ! Petite traduction :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:quote --><\/p>\n<blockquote class=\"wp-block-quote\"><p>Archives de Scryfall cartes Magic en 17 langues (y compris certaines langues non officielles).<\/p>\n<p>Chaque objet <em>Card<\/em> indique sa langue dans la propri\u00e9t\u00e9 <em>lang<\/em> en utilisant un code de type <em>ISO<\/em>. Lorsqu&rsquo;elles sont disponibles, les cartes peuvent \u00e9galement inclure leur texte imprim\u00e9 dans les champs <em>printed_name, printed_type_line, <\/em>et <em>printed_text.<\/em><\/p>\n<p>Veuillez noter que le texte Oracle est toujours en anglais, selon les r\u00e8gles du jeu. Les cartes imprim\u00e9es dans des langues autres que l&rsquo;anglais sont une traduction du texte Oracle au moment o\u00f9 la carte a \u00e9t\u00e9 imprim\u00e9e, mais ces textes ne re\u00e7oivent pas d&rsquo;errata.<\/p>\n<p>Notre support pour les langues multiples dans les jeux plus anciens est limit\u00e9. Nous d\u00e9veloppons lentement ces donn\u00e9es au fil du temps.<\/p><\/blockquote>\n<p><!-- \/wp:quote --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>J&rsquo;en d\u00e9duis plusieurs choses :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:list {\"ordered\":true} --><\/p>\n<ol>\n<li>C&rsquo;est une base de donn\u00e9e comprenant tout un tas de cartes Magic en diff\u00e9rentes langues (avec m\u00eame quelques traductions non officielles)<\/li>\n<li>Dans le tableau r\u00e9capitulatif, on voit qu&rsquo;il y a 50.737 cartes en anglais, et \u00ab\u00a0seulement\u00a0\u00bb\u00a0 28.567 cartes en fran\u00e7ais. Environ 50% \u00e0 la grosse louche.\u00a0 En effet, certaines cartes n&rsquo;ont jamais \u00e9t\u00e9 traduite. (Les cartes des extensions humouristiques par exemples). Mais le soucis ne vient pas de l\u00e0 car ce sont des cartes qui ne sont que tr\u00e9s rarement jou\u00e9es . Le probl\u00e9me c&rsquo;est que le site Scryfall ne contient pas toutes les illustrations en Fran\u00e7ais\u00a0 . <a href=\"https:\/\/scryfall.com\/search?q=lang%3Afr&amp;order=released&amp;dir=asc&amp;unique=prints\" target=\"_blank\" rel=\"noopener\">Voici un exemple .<\/a> On remarque que certaines des ces anciennes cartes ont l&rsquo;illustration avec le texte en francais, et pas d&rsquo;autres.<\/li>\n<\/ol>\n<p><!-- \/wp:list --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Voil\u00e0 donc pourquoi tout n&rsquo;est pas traduit en fran\u00e7ais. Est ce qu&rsquo;on pourrait pas s&rsquo;arranger pour compl\u00e9ter la collection ?<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>Comment fonctionne Cockatrice ?<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Avant d&rsquo;aller plus loin, je me suis int\u00e9ress\u00e9 au fonctionnement du logiciel Cockatrice. Dans les param\u00e8tres de Cockatrice, j&rsquo;ai remarqu\u00e9 une option int\u00e9ressante : <strong>R\u00e9pertoire des images . <\/strong>Allons y jeter un oeil.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1502,\"linkDestination\":\"custom\"} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog3-1-1.png\"><img decoding=\"async\" class=\"wp-image-1502\" title=\"\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog3-1-1.png?w=670\" alt=\"\"><\/a><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>On d\u00e9couvre alors un dossier, comprenant deux sous dossiers :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:list --><\/p>\n<ul>\n<li><strong>CUSTOM<\/strong><\/li>\n<li><strong>downloadedpics<\/strong><\/li>\n<\/ul>\n<p><!-- \/wp:list --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Le dossier CUSTOM etant vide, je m&rsquo;int\u00e9resse au dossier<strong><em> \u00ab\u00a0downloadedpics\u00a0\u00bb<\/em><\/strong> litt\u00e9ralement : <strong><em>\u00ab\u00a0images t\u00e9l\u00e9charg\u00e9es\u00a0\u00bb <\/em>. Et voil\u00e0 ce qu&rsquo;on d\u00e9couvre !<\/strong><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1504,\"linkDestination\":\"custom\"} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog4-1-1.png\"><img decoding=\"async\" class=\"wp-image-1504\" title=\"\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog4-1-1.png?w=670\" alt=\"\"><\/a><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Tout un tas de dossier avec d&rsquo;\u00e9tranges noms de 3 caract\u00e9res&#8230; Et si l&rsquo;on en ouvre un au hasard :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1505,\"linkDestination\":\"custom\"} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_edi-1-1.png\"><img decoding=\"async\" class=\"wp-image-1505\" title=\"\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_edi-1-1.png?w=670\" alt=\"\"><\/a><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Des cartes magic en .jpg ! Certaines sont en fran\u00e7ais; et si il n&rsquo;existe pas de versions fran\u00e7aise, vous allez avoir un joli bandeau sur la carte comme on l&rsquo;avait vu dans le pr\u00e9c\u00e9dent article :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1507,\"linkDestination\":\"custom\"} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/cockaen-1-e1592090606326-1-1.png\"><img decoding=\"async\" class=\"wp-image-1507\" title=\"\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/cockaen-1-e1592090606326-1-1.png?w=208\" alt=\"\"><\/a><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>J&rsquo;en d\u00e9duis que le logiciel affiche l&rsquo;illustration qui est contenue dans un de ces dossiers. Il reconnait l&rsquo;image avec son nom (en anglais).<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>Mais c&rsquo;est quoi tout ces dossiers ?<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>\u00c9videmment on pourrait se dire que tout serait plus simple si toutes les cartes \u00e9taient dans le m\u00eame dossier. Ici, on remarque qu&rsquo;il y a tout un tas de dossier avec des noms \u00e9tranges de trois caract\u00e8res. \u00c7a ne vous \u00e9voque peut \u00eatre rien, mais si vous jouez \u00e0 Magic depuis un moment comme moi, alors ca doit vous parler.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Chaque ann\u00e9e, la soci\u00e9t\u00e9 <strong><em>Wizard Of The Coast<\/em><\/strong> (filiale de Hasbro derri\u00e8re Magic) \u00e9dite de nouvelles cartes. Parfois il s&rsquo;agit de r\u00e9\u00e9dition, parfois de cartes totalement in\u00e9dite. Afin de s&rsquo;y retrouver, on retrouve dans le coin droit de la ligne de type : le symbole d&rsquo;extension. De plus, selon la couleur de ce symbole, vous pouvez connaitre la raret\u00e9 de la carte.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1510} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/2_expansion-1-1.jpg\"><img decoding=\"async\" class=\"wp-image-1510\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/2_expansion-1-1.jpg\" alt=\"\"><\/a><figcaption>Cette carte vient de l&rsquo;\u00e9dition de base Neuvi\u00e8me \u00e9dition (le symbole), et c&rsquo;est une carte rare (symbole dor\u00e9).<\/figcaption><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Chaque \u00e9dition est donc accompagn\u00e9e d&rsquo;un petit pictogramme pour la reconna\u00eetre. Vu que ce n&rsquo;est pas \u00e9vident de redessiner les petits pictogrammes sur un clavier d&rsquo;ordinateur, on peut aussi d\u00e9signer les extensions via un code de 3 caract\u00e8res. Voici quelques exemples :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:list --><\/p>\n<ul>\n<li><strong>M21<\/strong> pour l&rsquo;\u00e9dition Magic Core 2021<\/li>\n<li><strong>IKO<\/strong> pour l&rsquo;\u00e9dition Ikoria<\/li>\n<li><strong>DTK<\/strong> pour l&rsquo;\u00e9dition Dragon Of Tarkir (Dragons de Tarkir)<\/li>\n<li><strong>OTW<\/strong> pour l&rsquo;\u00e9dition Oath of the Gateway (Le serment des sentinelles)<\/li>\n<li><strong>MRD <\/strong>pour l&rsquo;\u00e9dition Mirrodin<\/li>\n<\/ul>\n<p><!-- \/wp:list --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Maintenant que l&rsquo;on sait \u00e7a, on sait que chaque image doit comporter les caract\u00e9risitques suivantes :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>1 &#8211; \u00eatre dans le bon dossier correspondant \u00e0 son \u00e9dition<br>\n2 &#8211; avoir le nom en anglais avec les majuscules, les espaces etc&#8230;<br>\n3 &#8211; \u00eatre en .jpg<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>Les cartes : c&rsquo;est comme les champignons. Faut conna\u00eetre les bons coins !<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>L&rsquo;id\u00e9e, ca serait de t\u00e9l\u00e9charger les scans des cartes en fran\u00e7ais, et de les mettre dans les dossiers correspondant. Mais o\u00f9 est ce qu&rsquo;on va trouver \u00e7a ? Il existe plusieurs sites sp\u00e9cialis\u00e9s ; voici les plus connus en France (et j&rsquo;imagine dans la francophonie&#8230;) :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:list --><\/p>\n<ul>\n<li><a href=\"https:\/\/www.magic-ville.com\/fr\/\" target=\"_blank\" rel=\"noopener\">Magic-Ville<\/a><\/li>\n<li><a href=\"http:\/\/www.magiccorporation.com\/\" target=\"_blank\" rel=\"noopener\">Magic Corporation<\/a><\/li>\n<li><a href=\"https:\/\/www.smfcorp.net\/\" target=\"_blank\" rel=\"noopener\">La Secte des Magiciens Fous<\/a> (SMF pour les intimes)<\/li>\n<li><a href=\"http:\/\/www.lotusnoir.info\/\" target=\"_blank\" rel=\"noopener\">Lotus Noir<\/a><\/li>\n<\/ul>\n<p><!-- \/wp:list --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Il en existe \u00e9videmment d&rsquo;autres mais je vais pas tout passer en revue&#8230; Sur ces sites, vous pouvez rechercher des cartes via les moteurs de recherches int\u00e9gr\u00e9s ; et g\u00e9n\u00e9ralement l&rsquo;illustration adjointe sera le scan de la carte en fran\u00e7ais. La qualit\u00e9 n&rsquo;est pas toujours parfaite mais c&rsquo;est mieux que rien non ?<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1516} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_carte2-1-1.png\"><img decoding=\"async\" class=\"wp-image-1516\" title=\"\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_carte2-1-1.png?w=670\" alt=\"\"><\/a><figcaption>Un exemple sur le site Magic-Ville. Remarquez que l&rsquo;illustration est en fran\u00e7ais.<\/figcaption><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>On prend quoi alors ?<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Vous vous doutez bien qu&rsquo;on va pas s&rsquo;amuser \u00e0 t\u00e9l\u00e9charger manuellement les cartes une \u00e0 une. Mais on va faire du traitement par lot. Et comme je suis malin, je vais m&rsquo;arranger pour avoir le moins de boulot \u00e0 faire. Nous allons donc inspecter nos 4 candidats (les sites cit\u00e9s ci dessus) et voir comment ils fonctionnent.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Dans le navigateur internet <strong><em>Firefox<\/em><\/strong>, on peut faire clic droit sur un \u00e9l\u00e9ment d&rsquo;une page internet (texte, photo, bouton , lien etc&#8230;) et cliquer sur <strong><em>\u00ab\u00a0Afficher l&rsquo;\u00e9l\u00e9lement\u00a0\u00bb<\/em><\/strong> pour voir le code HTML qui a derri\u00e9re tout \u00e7a. (Si vous n&rsquo;utilisez pas Firefox, faites une petite recherche sur les internets pour trouver comment faire avec votre navigateur pr\u00e9f\u00e9r\u00e9) . Pour la suite, quelques connaissances en HTML sont utile mais on peut faire sans.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:heading {\"level\":3} --><\/p>\n<h3>Candidat : SMF<\/h3>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1523} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_smf-1-1.png\"><img decoding=\"async\" class=\"wp-image-1523\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_smf-1-1.png?w=300\" alt=\"\"><\/a><figcaption>Cliquez pour agrandir<\/figcaption><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>On voit que notre image est dans un <em>&lt;div&gt;<\/em>&#8230; C&rsquo;est un peu bizarre je m&rsquo;attendais \u00e0 quelquechose du genre<em> img src = \u00ab\u00a0leliendel&rsquo;image\u00a0\u00bb<\/em>. Bon, je suis pas tr\u00e9s bon en HTML, j&rsquo;y comprends rien, candidat suivant !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator\">\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:heading {\"level\":3} --><\/p>\n<h3>Candidat : Magic Corpo<\/h3>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1521} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_magiccorpo-1-1.png\"><img decoding=\"async\" class=\"wp-image-1521\" title=\"\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_magiccorpo-1-1.png?w=300\" alt=\"\"><\/a><figcaption>Cliquez pour agrandir<\/figcaption><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>L\u00e0, on voit ce que j&rsquo;attendais, une belle balise <em>&lt;img src = \u00ab\u00a0blablabla\u00a0\u00bb&gt; <\/em>Il y a l&rsquo;extension de la carte; c&rsquo;est une bonne chose ! Et un num\u00e9ro qui d\u00e9finit la carte&#8230; Bon ok. Voyons voir les autres<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator\">\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:heading {\"level\":3} --><\/p>\n<h3>Candidat : Lotus Noir<\/h3>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1520} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_lotusnoir-1-1.png\"><img decoding=\"async\" class=\"wp-image-1520\" title=\"\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_lotusnoir-1-1.png?w=300\" alt=\"\"><\/a><figcaption>Cliquez pour agrandir<\/figcaption><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>L\u00e0, on voit que le lien est encore plus compliqu\u00e9, le nom de la carte est \u00e9crite en fran\u00e7ais, avec un nom \u00e0 rallonge (et pas de num\u00e9ro pour identifier la carte). Mais on remarque que l&rsquo;extension est indiqu\u00e9 avec le fameux code de 3 caract\u00e9res ! En effet FUT d\u00e9signe l&rsquo;extension <strong>Future Sight.<\/strong> Ca c&rsquo;est pratique tout de m\u00eame !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator\">\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:heading {\"level\":3} --><\/p>\n<h3>Candidat : MagicVille<\/h3>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1522} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_magicville-1-1.png\"><img decoding=\"async\" class=\"wp-image-1522\" title=\"\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_magicville-1-1.png?w=300\" alt=\"\"><\/a><figcaption>Cliquez pour agrandir<\/figcaption><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Voyons voir. Ha ! L\u00e0, c&rsquo;est beaucoup plus court, et plus pr\u00e9cis ! on a le trigramme de l&rsquo;extension suivit de FR pour indiquer que la carte est en fran\u00e7ais ; et \u00e0 la fin de tout \u00e7a un num\u00e9ro qui identifie la carte.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator\">\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>MagicVille en finale !<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Je s\u00e9lectionne la solution MagicVIlle :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:list --><\/p>\n<ul>\n<li>Lien simple (extension + FR + num\u00e9ro)<\/li>\n<li>Inconv\u00e9nient c&rsquo;est le FR qui se balade au milieu du lien justemment&#8230;<\/li>\n<\/ul>\n<p><!-- \/wp:list --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Faisons quelques tests, reprenons le lien de notre carte :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>https:\/\/www.magic-ville.com\/pics\/big\/futFR\/129.jpg<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Dans cette URL, on voit le site web, puis un r\u00e9p\u00e9rtoire <strong><em>\u00ab\u00a0pics\u00a0\u00bb<\/em><\/strong> qui doit contenir les images, puit le r\u00e9pertoire <strong><em>\u00ab\u00a0big\u00a0\u00bb<\/em><\/strong> qui doit contenir des images en grand formats, et enfin <strong><em>futFR<\/em><\/strong> et un num\u00e9ro. J&rsquo;en d\u00e9duis que <strong><em>fut<\/em><\/strong> signifie l&rsquo;extension Future Sight, et FR la langue. Si je remplace <strong><em>futFR<\/em><\/strong> par <strong><em>fut<\/em> <\/strong>je devrais avoir la carte en anglais ? Testons !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>https:\/\/www.magic-ville.com\/pics\/big\/fut\/129.jpg<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Bingo ! Maintenant, on va essayer de trouver la premi\u00e8re carte de l&rsquo;\u00e9dition fut (<em>Future Sight<\/em>), \u00e7a devrait normalement \u00eatre<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>https:\/\/www.magic-ville.com\/pics\/big\/fut\/1.jpg  <\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Ha&#8230; \u00c7a marche pas ! Essayons de comprendre pourquoi !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Dans le site MagicVille, je vais dans la page consacr\u00e9e aux <a href=\"https:\/\/www.magic-ville.com\/fr\/rech_set\" target=\"_blank\" rel=\"noopener\">diff\u00e9rentes \u00e9ditions<\/a> et je recherche l&rsquo;\u00e9dition <a href=\"https:\/\/www.magic-ville.com\/fr\/set_cards?setcode=142\" target=\"_blank\" rel=\"noopener\">Future Sight<\/a> . On nous affiche la liste de toutes les cartes de cette \u00e9dition, je s\u00e9lectionne la premi\u00e8re carte \u00e0 savoir l&rsquo;<a href=\"https:\/\/www.magic-ville.com\/fr\/carte?ref=fut001\" target=\"_blank\" rel=\"noopener\">Ange du Salut<\/a>. Examinons le lien de la carte&#8230; Il se termine par <strong><em>001.jpg<\/em> <\/strong>et non pas <strong><em>1.jpg<\/em> <\/strong>! Du coup, le lien corrig\u00e9 :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>https:\/\/www.magic-ville.com\/pics\/big\/fut\/001.jpg<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Youpi ! Et si je le veux en fran\u00e7ais, je rajoute FR et ca donne \u00e7a :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>https:\/\/www.magic-ville.com\/pics\/big\/futFR\/001.jpg<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Et maintenant, si je veux afficher une carte de l&rsquo;extension Mirrodin ? Le trigramme de Mirrodin est MRD. Essayons \u00e7a :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>https:\/\/www.magic-ville.com\/pics\/big\/mrdFR\/001.jpg<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Ha, ben ca marche pas&#8230; Qu&rsquo;est ce qu&rsquo;il se passe ? Une nouvelle fois, je fais une <a href=\"https:\/\/www.magic-ville.com\/fr\/rech_set\" target=\"_blank\" rel=\"noopener\">recherche par \u00e9ditions<\/a>, et je me retrouve sur la liste de <a href=\"https:\/\/www.magic-ville.com\/fr\/set_cards?setcode=110\" target=\"_blank\" rel=\"noopener\">Mirrodin.<\/a> Si l&rsquo;on clique sur n&rsquo;importe quelle carte, on verra que bien que la carte existe en fran\u00e7ais, le scan sur Magic-Ville est en anglais&#8230; Mal\u00e9diction ! On aurait fait tout \u00e7a pour rien ?<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Patience jeune padawan ! C&rsquo;est d\u00e9j\u00e0 mieux que rien, voyons si l&rsquo;on peut compl\u00e9ter notre collection avec un traitement par lot&#8230;<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator\">\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:heading {\"level\":1} --><\/p>\n<h1>Le gros du boulot<\/h1>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>D\u00e9finissons des objectifs<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Bon, maintenant r\u00e9fl\u00e9chissons \u00e0 un programme. D\u00e9finissons ce qu&rsquo;il doit faire :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>1 &#8211; Balayer toute une s\u00e9rie de lien<br>\n2 &#8211; T\u00e9l\u00e9charger l&rsquo;image<br>\n3 &#8211; La nommer avec le non nom<br>\n4 &#8211; L&rsquo;enregistrer au bon endroit<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>On pourrait am\u00e9liorer \u00e7a en rajoutant des conditions : si la carte est d\u00e9j\u00e0 en fran\u00e7ais dans la base de donn\u00e9e Scryfall, on s&#8217;emb\u00eate pas \u00e0 la t\u00e9l\u00e9charger. M\u00eame chose si la carte n&rsquo;est pas dispo en fran\u00e7ais.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>Simplifions le probl\u00e8me<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Avant de m&#8217;embarquer dans un logiciel super complet avec plein d&rsquo;option, je vais simplifier le probl\u00e8me en essayant une chose simple. <strong>T\u00e9l\u00e9charger toutes les cartes d&rsquo;une extension.<\/strong><br>\nOn l&rsquo;a vu pr\u00e9c\u00e9demment, sur Magic-Ville les liens vers les images ressemblent \u00e0 ceci :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>https:\/\/www.magic-ville.com\/pics\/big\/futFR\/129.jpg<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Du coup, il faudrait juste changer le num\u00e9ro de l&rsquo;image et faire toutes les combinaisons : 001,002,003 etc&#8230; pour tout t\u00e9l\u00e9charger. \u00c9videmment, on va pas faire \u00e7a \u00e0 la main.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Pour nos tests, on va juste essayer de t\u00e9l\u00e9charger quelques unes des premi\u00e8res cartes. Une fois encore, c&rsquo;est pour simplifier le probl\u00e8me et d\u00e9j\u00e0 voir ce qu&rsquo;on peut faire avec \u00e7a.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>Quel langage on utilise ?<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Il existe tout un tas de langage de programmation, j&rsquo;ai choisis le Python. Pourquoi ? Parce qu\u2019il est tr\u00e8s utilis\u00e9, je trouverais plein d&rsquo;aide en ligne; et qu&rsquo;il est \u00ab\u00a0relativement simple\u00a0\u00bb \u00e0 assimiler. On dit que c&rsquo;est <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Langage_de_programmation_de_haut_niveau\" target=\"_blank\" rel=\"noopener\">un langage de \u00ab\u00a0haut niveau\u00a0\u00bb.<\/a><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Alors \u00e9videmment pour la suite, c&rsquo;est mieux si on conna\u00eet un peu les langages de programmation, par exemple si on sait ce que c&rsquo;est qu&rsquo;un IF , un LOOP, ou un bool\u00e9en&#8230; Vous trouverez tout un tas de tutoriel pour apprendre les rudiments du Python. Faut pas avoir peur, j&rsquo;y connais rien moi non plus et j&rsquo;ai commenc\u00e9 par l\u00e0&#8230; Le but de cet article n&rsquo;est pas de vous apprendre \u00e0 utiliser le python, vous verrez donc ci dessous ma d\u00e9marche pas \u00e0 pas et non pas une explication d\u00e9taill\u00e9e de chaque commande. Pour info, j&rsquo;utilise Python3 (choix arbitraire) et Spyder pour m&rsquo;aider (un logiciel pour aider \u00e0 coder en Python; j&rsquo;ai choisis \u00e7a au pif&#8230;)<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>C&rsquo;est parti !<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Mon premier bout de programme va tenter de g\u00e9n\u00e9rer automatiquement les adresses pour t\u00e9l\u00e9charger les images. Mais vu que je suis vraiment une quiche, je vais encore simplifier le probl\u00e8me, je vais d\u00e9j\u00e0 essayer d&rsquo;incr\u00e9menter des chiffres de 1 \u00e0 10&#8230;<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Je me suis rappel\u00e9 de mes bases de Python et je me suis <a href=\"https:\/\/openclassrooms.com\/fr\/courses\/235344-apprenez-a-programmer-en-python\/231260-apprenez-a-faire-des-boucles\" target=\"_blank\" rel=\"noopener\">aid\u00e9 de \u00e7a.<\/a> Voil\u00e0 \u00e0 quoi ca ressemble : (faites attention \u00e0 l&rsquo;indentation du code !)<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Si vous voulez tester le code, utiliser<a href=\"https:\/\/repl.it\/languages\/python3\" target=\"_blank\" rel=\"noopener\"> ce site par exemple<\/a> vous verrez ce r\u00e9sultat (\u00e0 droite) :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1545,\"linkDestination\":\"custom\"} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/python1-1-1.png\"><img decoding=\"async\" class=\"wp-image-1545\" title=\"\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/python1-1-1.png?w=670\" alt=\"\"><\/a><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Youpi ! Je compte jusqu&rsquo;a 10 !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator\">\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Maintenant, je vais rajouter ce qu&rsquo;il faut pour avoir l&rsquo;URL compl\u00e8te.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:syntaxhighlighter\/code {\"language\":\"python\"} --><\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">baseURL = 'https:\/\/www.magic-ville.com\/pics\/big\/futFR\/'\nPointDeDepart = 1\n\nwhile PointDeDepart &lt;=10:\n newURL = baseURL + str(PointDeDepart) + '.jpg'\n print(newURL)\n PointDeDepart = PointDeDepart + 1<\/pre>\n<p><!-- \/wp:syntaxhighlighter\/code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Voil\u00e0 le r\u00e9sultat (oui WordPress c&rsquo;est du caca, il voulait rien savoir je suis oblig\u00e9 d\u2019int\u00e9grer le r\u00e9sultat comme une image)<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"id\":1622,\"sizeSlug\":\"large\"} --><\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" class=\"wp-image-1622\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/caca-1-1.png?w=590\" alt=\"\"><\/figure>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Alors on est content, mais je vous rappel que c&rsquo;est pas 1.jpg mais 001. jpg !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator\">\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Une petite recherche sur les internets, je tombe <a href=\"https:\/\/stackoverflow.com\/questions\/22214949\/generate-numbers-with-3-digits\/22215011\" target=\"_blank\" rel=\"noopener\">l\u00e0 dessus<\/a> et on en arrive a ce bout de code l\u00e0 :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:syntaxhighlighter\/code {\"language\":\"python\"} --><\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">baseURL = 'https:\/\/www.magic-ville.com\/pics\/big\/futFR\/'\nPointDeDepart = 1\nwhile PointDeDepart &lt;=10:\n    newURL = baseURL + str(f'{PointDeDepart:03}') + '.jpg'\n    print(newURL)\n    PointDeDepart = PointDeDepart + 1<\/pre>\n<p><!-- \/wp:syntaxhighlighter\/code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Et voil\u00e0 le r\u00e9sultat : (encore une image car pas moyen de juste vous mettre le texte, WordPress veut imp\u00e9rativement mettre des balises autour&#8230;)<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"id\":1623,\"sizeSlug\":\"large\"} --><\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" class=\"wp-image-1623\" title=\"\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/caca-12-1-1.png?w=602\" alt=\"\"><\/figure>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Youpi ! Cliquons sur un lien pour tester\u2026 \u00c7a marche ! Maintenant t\u00e9l\u00e9chargeons les images\u2026<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator\">\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Toujours en cherchant sur les internets, <a href=\"https:\/\/www.science-emergence.com\/Articles\/Sauvegarder-localement-une-image-du-web-avec-python\/\" target=\"_blank\" rel=\"noreferrer noopener\">j\u2019ai trouv\u00e9 \u00e7a !<\/a> \u00c7a tombe bien, c\u2019est ce qu\u2019on veut !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:syntaxhighlighter\/code {\"language\":\"python\"} --><\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">import urllib.request\nbaseURL = 'https:\/\/www.magic-ville.com\/pics\/big\/futFR\/'\nPointDeDepart = 1\n\nwhile PointDeDepart &lt;=10:\n    newURL = baseURL + str(f'{PointDeDepart:03}') + '.jpg'\n    urllib.request.urlretrieve(newURL, str(f'{PointDeDepart:03}') + '.jpg')\n    PointDeDepart = PointDeDepart + 1<\/pre>\n<p><!-- \/wp:syntaxhighlighter\/code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Voil\u00e0 le r\u00e9sultat ! On voit qu\u2019on a t\u00e9l\u00e9charg\u00e9 les 10 premi\u00e8res images !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1552,\"linkDestination\":\"custom\"} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_extract-1-1.png\"><img decoding=\"async\" class=\"wp-image-1552\" title=\"\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_extract-1-1.png?w=670\" alt=\"\"><\/a><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Alors \u00e9videmment, sur un environnement en ligne, c&rsquo;est pas pratique mais voil\u00e0 ce que \u00e7a donne si on ex\u00e9cute le code sur sa machine !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1554,\"linkDestination\":\"custom\"} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_extract-12-1-1.png\"><img decoding=\"async\" class=\"wp-image-1554\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_extract-12-1-1.png\" alt=\"\"><\/a><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Youpi !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator\">\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Est ce qu\u2019on a fait tout \u00e7a pour rien ? Ben allons voir. Prenons le fichier <strong><em>001.jpg<\/em><\/strong> : l\u2019<strong>Ange de salut<\/strong> qu\u2019on a vu ci dessus. Puis dans Cockatrice, faisons une recherche avec son nom anglais, <strong><em>Angel Of Salvation<\/em><\/strong>, on voit que l\u2019image n\u2019a pas \u00e9t\u00e9 trouv\u00e9 en fran\u00e7ais par Scryfall.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"id\":1556,\"width\":561,\"height\":453,\"sizeSlug\":\"large\"} --><\/p>\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-1556 size-full\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_newimage-1.png\" alt=\"Pr\u00e9sentation de la carte Angel Of Salvation dans Cockatrice en Anglais\" width=\"561\" height=\"453\"><\/figure>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Retournons maintenant dans le r\u00e9pertoire des images de Cockatrice. Dans le r\u00e9pertoire <em><strong>downloadedPics<\/strong><\/em> ; on va ensuite chercher le dossier FUT ou le cr\u00e9er si il n\u2019existe pas. Puis on va ajouter la carte qu\u2019on vient de t\u00e9l\u00e9charger. On oublie pas de la renommer avec le bon nom !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1562} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_repertoire-1-1.png\"><img decoding=\"async\" class=\"wp-image-1562\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_repertoire-1-1.png?w=300\" alt=\"\"><\/a><figcaption>Le bon nom, et le bon r\u00e9pertoire (attention aux majuscules !)<\/figcaption><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Red\u00e9marrons Cockatrice pour prendre en compte ces modifications&#8230; <strong>Horreur !<\/strong> \u00c7a n&rsquo;a pas march\u00e9&#8230; Pourquoi ? J&rsquo;ai d\u00e9couvert lors de mes parties que Cockatrice va utiliser l&rsquo;illustration la plus r\u00e9cente. Or, si on regarde bien ; dans Cockatrice, l&rsquo;Ange de Salvation n&rsquo;est pas celui de l&rsquo;\u00e9dition <strong><em>FUT (Futur Sight)<\/em><\/strong> mais d&rsquo;une autre \u00e9dition, \u00e0 savoir <strong><em>Dual Deck : Elspeth VS Tezzeret. <\/em><\/strong><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1560} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/angel-of-salvation-e1592101853496-1-1.jpg\"><img decoding=\"async\" class=\"wp-image-1560\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/angel-of-salvation-e1592101853496-1-1.jpg\" alt=\"\"><\/a><figcaption>Le symbole de l&rsquo;extension<\/figcaption><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Bon, du coup, on retourne dans le r\u00e9pertoire des images et on cherche le r\u00e9pertoire de notre extension&#8230; Pour information le trigramme est DDF. On remplace l&rsquo;image existante par la notre, on fait bien attention au nom de la carte encore une fois. On relance Cockatrice. Et l\u00e0 : MIRACLE ! Ca fonctionne !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1564,\"linkDestination\":\"custom\"} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_angel2-1-1.png\"><img decoding=\"async\" class=\"wp-image-1564\" title=\"\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_angel2-1-1.png?w=300\" alt=\"\"><\/a><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>Demi-d\u00e9faite<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Alors certe ca marche. Mais on se rend compte d&rsquo;un gros probl\u00e9me que je n&rsquo;avais pas identifi\u00e9 plus t\u00f4t : la gestion des extensions. Ca veut dire que pour chaque carte il faudra v\u00e9rifier ces histoires d&rsquo;extensions, remplacer la carte dans l&rsquo;extension la plus r\u00e9cente etc&#8230; Ca serait tellement plus simple si tout \u00e9tait dans un seul r\u00e9pertoire !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Mais attendez une seconde&#8230; Tout \u00e0 l&rsquo;heure, on avait vu qu&rsquo;il y avait DEUX r\u00e9pertoires pour g\u00e9rer les images :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:list --><\/p>\n<ul>\n<li>CUSTOM<\/li>\n<li>downloadedPics<\/li>\n<\/ul>\n<p><!-- \/wp:list --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Il se passe quoi si je met ma carte dans CUSTOM ? Pour v\u00e9rifier \u00e7a, je barbouille l\u2019image pour m\u2019en servir comme d\u00e9trompeur. Ainsi, je verrai ce que Cockatrice charge comme illustration ! On relance Cockatrice pour mettre tout \u00e7a \u00e0 jour et\u2026<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1567} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_angelofsalvation-1-1.png\"><img decoding=\"async\" class=\"wp-image-1567\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_angelofsalvation-1-1.png?w=300\" alt=\"\"><\/a><figcaption>Quel chef-d&rsquo;oeuvre !<\/figcaption><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Tadaaa ! On a r\u00e9ussit ! On a donc plus \u00e0 s\u2019emb\u00eater avec les extensions ! On r\u00e9cup\u00e8re les images, et on les mets l\u00e0 dedans !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>La remontada !<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Il subsiste encore un petit probl\u00e8me l\u00e0 dedans : comment on va faire pour renommer les cartes avec le bon nom ? On va pas s&rsquo;amuser \u00e0 le faire \u00e0 la main pour chaque carte ! Pour \u00e7a, j&rsquo;ai pour id\u00e9e d&rsquo;aller extraire le nom de la carte depuis le site MagicVille.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Reprenons l&rsquo;Ange du Salut dans l&rsquo;\u00e9dition Future Sight ; puis examinons une nouvelle fois le code HTML de la page. On remarque que le nom de la carte est comprise entre deux balises tr\u00e8s particuli\u00e8re :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:syntaxhighlighter\/code --><\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">&lt;div class=S16&gt;Angel of Salvation&lt;\/div&gt;<\/pre>\n<p><!-- \/wp:syntaxhighlighter\/code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>On pourrait faire une recherche dans ce code HTML et extraire le nom de la carte ? Elle est rep\u00e9r\u00e9 par cette balise S16 ! Et bonne nouvelle, si on examine en d\u00e9tail le code de la page, il n&rsquo;y a que deux occurrences ! Une pour le nom en Fran\u00e7ais, une autre pour le nom en Anglais ! Du coup, \u00e7a limite grandement les recherches !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p><strong>Note :<\/strong> pour examiner le code de la page , faite un clic droit sur celle ci et \u00ab\u00a0Code source de la page\u00a0\u00bb (Sur Firefox, on fait comme \u00e7a en tout cas&#8230; Vous pouvez tenter aussi de copier coller ceci dans votre barre d&rsquo;adresse :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:syntaxhighlighter\/code --><\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">view-source:https:\/\/www.magic-ville.com\/fr\/carte?ref=fut001<\/pre>\n<p><!-- \/wp:syntaxhighlighter\/code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Mais du coup, comment on va faire pour relier la carte 001 au nom <strong><em>Angel of Salvation<\/em><\/strong> ? C&rsquo;est en effet un probl\u00e8me que je n&rsquo;avais pas anticip\u00e9&#8230; R\u00e9ch\u00e9flissons !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Regardons l&rsquo;URL de notre carte :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>https:\/\/www.magic-ville.com\/fr\/carte?ref=fut001 <\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Vos yeux attentifs auront certainement remarqu\u00e9 la fin de cette URL&#8230; <em><strong>fut<\/strong> <\/em>d\u00e9signe l&rsquo;extension et 001 le num\u00e9ro de la carte.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Du coup, on pourrait a nouveau balayer chaque URL (on sait le faire, on l&rsquo;a fait pour les images tout \u00e0 l&rsquo;heure) et sur chaque page web, identifier le nom dans le code HTML, et l&#8217;emplacement de l&rsquo;image !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator\">\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>Yapluka<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Alors \u00e9videmment, \u00e7a va changer notre strat\u00e9gie et une bonne partie du code qu&rsquo;on a fait va \u00eatre modifi\u00e9 en profondeur. Mais \u00e7a fait partie du jeu ! Repartons de z\u00e9ro et simplifions notre probl\u00e8me pour s&rsquo;attaquer \u00e0 un petit morceau \u00e0 la fois : l\u00e0, le but, est simplement de scanner le code HTML d&rsquo;une page,<strong> et de simplement r\u00e9cup\u00e9rer le nom. <\/strong><a href=\"https:\/\/stackoverflow.com\/questions\/32894497\/extract-a-word-that-follows-a-particular-word-from-a-webpage-with-python\" target=\"_blank\" rel=\"noopener\">Je me suis aid\u00e9 de \u00e7a.<\/a><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:syntaxhighlighter\/code {\"language\":\"python\"} --><\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">import re\nimport requests\nresponse = requests.get('https:\/\/www.magic-ville.com\/fr\/carte?ref=fut001')\nName = re.search(r'&lt;div class=S16&gt;(.+)&lt;\/div&gt;',response.text).group(1)\nprint (Name)\n<\/pre>\n<p><!-- \/wp:syntaxhighlighter\/code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Et on aura comme r\u00e9ponse <em>\u00ab\u00a0Ange du Salut\u00a0\u00bb <\/em>&#8230; Comme je l&rsquo;ai expliqu\u00e9 plus t\u00f4t, il y a deux balises S16, la premi\u00e8re contient le nom en Fran\u00e7ais, et l&rsquo;autre est en Anglais. Ici, la recherche s&rsquo;arr\u00eate d\u00e9s qu&rsquo;elle trouve le premier r\u00e9sultat. Il faudrait trouver un moyen de lui dire de prendre le deuxi\u00e8me r\u00e9sultat&#8230; <a href=\"https:\/\/developers.google.com\/edu\/python\/regular-expressions#findall\" target=\"_blank\" rel=\"noopener\">Je me suis aid\u00e9 de \u00e7a.<\/a> Voici le code que j&rsquo;ai r\u00e9ussi \u00e0 cr\u00e9\u00e9, je vous ai rajout\u00e9 des commentaires en prime \ud83d\ude42<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:syntaxhighlighter\/code {\"language\":\"python\"} --><\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">import re\nimport requests\n\nresponse = requests.get('https:\/\/www.magic-ville.com\/fr\/carte?ref=fut001')\n\n##On recherche toutes les balises S16 et on r\u00e9cup\u00e9re ce qu'il y a \u00e0 l'int\u00e9rieur\nName = re.findall(r'&lt;div class=S16&gt;(.+)&lt;\/div&gt;',response.text)\n\n## Voici tous les r\u00e9sultats :\nprint (Name)\n\n##Pour r\u00e9cup\u00e9rer uniquement le second r\u00e9sultat : (Rappel, en informatique, le premier \u00e9lement d'une liste est \u00e0 la position 0)\nprint (Name[1])<\/pre>\n<p><!-- \/wp:syntaxhighlighter\/code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Si on essaye ce code, on obtient les r\u00e9sultats suivants :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:preformatted --><\/p>\n<pre class=\"wp-block-preformatted\">['Ange du salut ', 'Angel of Salvation']\nAngel of Salvation<\/pre>\n<p><!-- \/wp:preformatted --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>La premi\u00e8re ligne c&rsquo;est le r\u00e9sultat de toute la recherche, la deuxi\u00e8me : uniquement le nom qui nous int\u00e9resse !!<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator\">\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>Retrouver l&rsquo;image<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Bon, maintenant qu&rsquo;on a retrouv\u00e9 le nom, il faut retrouver l&rsquo;image ! Pour cela on va une nouvelle fois scanner le code HTML pour r\u00e9cup\u00e9rer l&rsquo;adresse de l&rsquo;image. En analysant la page comme pr\u00e9c\u00e9demment, voici le petit morceau que je recherche :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>&lt;img src=..\/pics\/big\/futFR\/001.jpg&gt;&lt;\/td&gt;&lt;\/tr&gt;<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Coup de chance, il n\u2019appara\u00eet qu&rsquo;une seule fois dans la page ! Dans l&rsquo;absolu on pourrait utiliser la commande <em><strong>search<\/strong><\/em> au lieu de la commande <em><strong>findall<\/strong><\/em> ; mais j&rsquo;ai pas r\u00e9ussi&#8230; Du coup j&rsquo;ai r\u00e9ussi \u00e0 r\u00e9cup\u00e9rer <strong><em>futFR\/001.jpg <\/em><\/strong>. On recolle ce petit bout pour reconstituer l&rsquo;URL compl\u00e8te et t\u00e9l\u00e9charger l&rsquo;image. C&rsquo;est super simple !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:syntaxhighlighter\/code {\"language\":\"python\"} --><\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">## import des librairies\nimport urllib.request\nimport re\nimport requests\n\n## d\u00e9finition des variables\nbaseURL = 'https:\/\/www.magic-ville.com\/pics\/big\/'\nresponse = requests.get('https:\/\/www.magic-ville.com\/fr\/carte?ref=fut001')\n\n##On recherche toutes les balises S16 et on r\u00e9cup\u00e9re ce qu'il y a \u00e0 l'int\u00e9rieur\nName = re.findall(r'&lt;div class=S16&gt;(.+)&lt;\/div&gt;',response.text)\nImage = re.findall(r'&lt;img src=..\/pics\/big\/(.+)&gt;&lt;\/td&gt;&lt;\/tr&gt;',response.text)\n\n## reconsitution de l'URL de l'image et t\u00e9l\u00e9chargement\nnewURL = baseURL + str(Image[0])\n\n## Nom de la carte en anglais , et de son URL pour v\u00e9rifier...\nprint (Name[1])\nprint (newURL)\n\n## t\u00e9l\u00e9chargement de la carte\nurllib.request.urlretrieve(newURL, str(Name[1]))\n<\/pre>\n<p><!-- \/wp:syntaxhighlighter\/code --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1581} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_runpython-1-1.jpg\"><img decoding=\"async\" class=\"wp-image-1581\" title=\"\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/blog_runpython-1-1.jpg?w=670\" alt=\"\"><\/a><figcaption>J&rsquo;ai lanc\u00e9 la commande depuis le terminal Linux, et on voit bien les deux lignes \u00ab\u00a0debug\u00a0\u00bb et au final, l&rsquo;image est t\u00e9l\u00e9charg\u00e9 avec le bon nom\u00a0 !\u00a0 (Et en fran\u00e7ais du coup !)<\/figcaption><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator\">\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>A grande \u00e9chelle<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Et si maintenant, on t\u00e9l\u00e9chargeait TOUTES les cartes de l&rsquo;extension FUT ? Il suffit de balayer chaque page du site ! Rappelez vous de l&rsquo;URL :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>https:\/\/www.magic-ville.com\/fr\/carte?ref=fut001 <\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Il suffirait d&rsquo;incr\u00e9menter les trois derniers chiffres, 001&#8230;002&#8230;003&#8230; jusque la derni\u00e8re carte de l&rsquo;extension (elle en contient 180) et on est bon ! Pour m&rsquo;aider, j&rsquo;ai repris tout ce qu&rsquo;on a fait avant, et j&rsquo;ai fusionn\u00e9 tout \u00e7a pour aboutir \u00e0 ceci : (notez que j&rsquo;en ai profit\u00e9 pour changer le nom des variables et continu\u00e9 de commenter le code)<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:syntaxhighlighter\/code {\"language\":\"python\"} --><\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">## import des librairies\nimport urllib.request\nimport re\nimport requests\n\n## d\u00e9finition des variables, on diff\u00e9rencie l'url de l'image, de l'URL qui nous permettra de retrouver le nom\nbaseURL_img = 'https:\/\/www.magic-ville.com\/pics\/big\/'\nbaseURL_name = 'https:\/\/www.magic-ville.com\/fr\/carte?ref=fut'\n\n## on commence par la premi\u00e9re carte, on arr\u00eate \u00e0 la 180\u00e9me (la derni\u00e9re)\nstart = 1\nend = 180\n\n## on fait une boucle, qui s'arr\u00eatera \u00e0 la derni\u00e9re carte\nwhile start &lt;=end:\n\n    ## on va g\u00e9n\u00e9rer l'URL de la page \u00e0 scanner\n    newURL_name = baseURL_name +str(f'{start:03}')\n    \n    ## on r\u00e9cup\u00e9re le code HTML de la page \n    codeHTML = requests.get(newURL_name)\n    \n    ## On recherche toutes les balises S16 et on r\u00e9cup\u00e9re ce qu'il y a \u00e0 l'int\u00e9rieur (le nom de la carte)\n    Name = re.findall(r'&lt;div class=S16&gt;(.+)&lt;\/div&gt;',codeHTML.text)\n    Image = re.findall(r'&lt;img src=..\/pics\/big\/(.+)&gt;&lt;\/td&gt;&lt;\/tr&gt;',codeHTML.text)\n    \n    ## On g\u00e9n\u00e9re de l'URL de l'image\n    newURL_img = baseURL_img + str(Image[0])\n    \n    ## On t\u00e9l\u00e9charge la carte\n    urllib.request.urlretrieve(newURL_img, str(Name[1]+'.jpg'))\n    \n    ## On affiche ce qui se passe \u00e0 l'\u00e9cran et le nombre de carte restante\n    \n    print ('T\u00e9l\u00e9chargement de', str(Name[1]), str(start),'\/',str(end))\n    \n    ## On incr\u00e9mente start\n    \n    start = start + 1\n<\/pre>\n<p><!-- \/wp:syntaxhighlighter\/code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Voil\u00e0 ce que \u00e7a donne en image ! (Excusez moi de la qualit\u00e9, j&rsquo;ai fait au mieux&#8230; On peut pas importer des formats vid\u00e9os sur <em>wordpress.com<\/em>&#8230; \ud83d\ude41 )<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"align\":\"center\",\"id\":1586} --><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/import-cartes-magic_1-1-1.gif\"><img decoding=\"async\" class=\"wp-image-1586\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/import-cartes-magic_1-1-1.gif\" alt=\"\"><\/a><figcaption>On arrive \u00e0 deviner que je t\u00e9l\u00e9charge les 10 premi\u00e8res images de l&rsquo;extension. Je n&rsquo;ai pas fait les 180 d&rsquo;une part pour v\u00e9rifier que tout marchait bien, et d&rsquo;autre part pour \u00e9viter de faire planter le PC pendant la capture vid\u00e9o .<\/figcaption><\/figure>\n<\/div>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator\">\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>Am\u00e9liorer le machin<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:heading {\"level\":3} --><\/p>\n<h3>Les cartes en Fran\u00e7ais uniquement !<\/h3>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Bon alors, on est content. Qu&rsquo;est ce qu&rsquo;on pourrait faire pour am\u00e9liorer le machin ? Entre autre, on pourrait ne t\u00e9l\u00e9charger la carte QUE si elle est en fran\u00e7ais. Je rappel que sur MagicVille, les cartes de l&rsquo;extension Mirrodin sont en anglais (c&rsquo;est un exemple parmi tant d&rsquo;autres). Tout \u00e0 l&rsquo;heure, on a vu que les URL des scans en fran\u00e7ais ont la mention FR juste apr\u00e8s le trigramme de l&rsquo;extension. Voici un exemple :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>https:\/\/www.magic-ville.com\/pics\/big\/futFR\/001.jpg<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Retirer le FR et vous aurez la carte en anglais ! On pourrait faire en sorte que notre petit bout de code v\u00e9rifie que ce petit FR est pr\u00e9sent avant de t\u00e9l\u00e9charger la carte&#8230; Alors je me suis <a href=\"https:\/\/www.codeflow.site\/fr\/article\/python__python-check-if-a-string-contains-another-string\">aid\u00e9 de \u00e7a<\/a>, et de<a href=\"https:\/\/python.doctor\/page-apprendre-conditions-structures-conditionnelles-if-else-python-cours-debutant\"> \u00e7a.<\/a> J&rsquo;en ai profit\u00e9 pour faire un truc un peu plus joli sur l&rsquo;affichage des r\u00e9sultats. J&rsquo;ai donc ajout\u00e9 le trigramme <strong><em>mrd<\/em> <\/strong>pour Mirrodin, et avoir mis la fin \u00e0 10 pour ne tester qu&rsquo;avec les dix premi\u00e8res cartes.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:syntaxhighlighter\/code {\"language\":\"python\"} --><\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">## import des librairies\nimport urllib.request\nimport re\nimport requests\n\n## d\u00e9finition des variables, on diff\u00e9rencie l'url de l'image, de l'URL qui nous permettra de retrouver le nom\nbaseURL_img = 'https:\/\/www.magic-ville.com\/pics\/big\/'\nbaseURL_name = 'https:\/\/www.magic-ville.com\/fr\/carte?ref=mrd'\n\n## on commence par la premi\u00e9re carte, on arr\u00eate \u00e0 la 180\u00e9me (la derni\u00e9re)\nstart = 1\nend = 10\n\n## on fait une boucle, qui s'arr\u00eatera \u00e0 la derni\u00e9re carte\nwhile start &lt;=end:\n    \n    ## on va g\u00e9n\u00e9rer l'URL de la page \u00e0 scanner\n    newURL_name = baseURL_name +str(f'{start:03}')\n    \n    ## on r\u00e9cup\u00e9re le code HTML de la page \n    codeHTML = requests.get(newURL_name)\n    \n    ## On recherche toutes les balises S16 et on r\u00e9cup\u00e9re ce qu'il y a \u00e0 l'int\u00e9rieur (le nom de la carte)\n    Name = re.findall(r'&lt;div class=S16&gt;(.+)&lt;\/div&gt;',codeHTML.text)\n    Image = re.findall(r'&lt;img src=..\/pics\/big\/(.+)&gt;&lt;\/td&gt;&lt;\/tr&gt;',codeHTML.text)\n    \n    if \"FR\" in str(Image): \n    \n        ## On g\u00e9n\u00e9re de l'URL de l'image\n        newURL_img = baseURL_img + str(Image[0])\n        \n        ## On t\u00e9l\u00e9charge la carte\n        urllib.request.urlretrieve(newURL_img, str(Name[1])+'.jpg')\n        \n        ## On affiche ce qui se passe \u00e0 l'\u00e9cran et le nombre de carte restante\n        print ('[',str(start),'\/',str(end),'] - T\u00e9l\u00e9chargement de', str(Name[1]))\n    \n    else:\n    \n        print ('[',str(start),'\/',str(end),'] - Pas de scan en fran\u00e7ais - ', str(Name[1]) )\n    \n    ## On incr\u00e9mente start\n    start = start + 1\n\n<\/pre>\n<p><!-- \/wp:syntaxhighlighter\/code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Voil\u00e0 ce qu&rsquo;on obtient comme r\u00e9sultat avec les 10 premi\u00e8res cartes de Mirrodin :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>[ 1 \/ 10 ] - Pas de scan en fran\u00e7ais - Altar's Light\n[ 2 \/ 10 ] - Pas de scan en fran\u00e7ais - Arrest\n[ 3 \/ 10 ] - Pas de scan en fran\u00e7ais - Auriok Bladewarden\n[ 4 \/ 10 ] - Pas de scan en fran\u00e7ais - Auriok Steelshaper\n[ 5 \/ 10 ] - Pas de scan en fran\u00e7ais - Auriok Transfixer\n[ 6 \/ 10 ] - Pas de scan en fran\u00e7ais - Awe Strike\n[ 7 \/ 10 ] - Pas de scan en fran\u00e7ais - Blinding Beam\n[ 8 \/ 10 ] - Pas de scan en fran\u00e7ais - Leonin Abunas\n[ 9 \/ 10 ] - Pas de scan en fran\u00e7ais - Leonin Den-Guard\n[ 10 \/ 10 ] - Pas de scan en fran\u00e7ais - Leonin Elder<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:heading {\"level\":3} --><\/p>\n<h3><\/h3>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:heading {\"level\":3} --><\/p>\n<h3>D\u00e9terminer tout seul la fin de l&rsquo;extension<\/h3>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Depuis tout \u00e0 l&rsquo;heure on s&rsquo;amuse \u00e0 rentrer \u00e0 la main combien de carte vont \u00eatre balay\u00e9. Sauf que dans Magic, les \u00e9ditions ne comportent pas toutes le m\u00eame nombre de cartes. A la louche \u00e7a va de 100 \u00e0 400 cartes selon les \u00e9ditions. Du coup, plut\u00f4t que de s&#8217;emb\u00eater \u00e0 modifier \u00e7a \u00e0 la main, on pourra faire en sorte que notre petit programme s&rsquo;arr\u00eate tout seul une fois qu&rsquo;il a fini.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>J&rsquo;ai aucune id\u00e9e de comment faire \u00e7a, alors j&rsquo;ai fait expr\u00e9s de faire planter le programme. J&rsquo;ai demand\u00e9 de balayer les cartes 179 \u00e0 190 de l&rsquo;extension <em><strong>fut . <\/strong><\/em> L&rsquo;extension ne comporte que 180 cartes. Voyons voir ce qu&rsquo;il se passe :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>[ 179 \/ 190 ] - T\u00e9l\u00e9chargement de River of Tears\n[ 180 \/ 190 ] - T\u00e9l\u00e9chargement de Zoetic Cavern\nTraceback (most recent call last):\n  File \"projet4.py\", line 38, in &lt;module&gt;\n    print ('[',str(start),'\/',str(end),'] - Pas de scan en fran\u00e7ais - ', str(Name[1]) )\nIndexError: list index out of range<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Tout va bien sur les deux premi\u00e8res cartes, et puis&#8230; <strong>patatra !<\/strong> On pourrait se servir de cette erreur pour arr\u00eater le tout proprement ? Je me suis<a href=\"https:\/\/docs.python.org\/fr\/3.5\/tutorial\/errors.html\" target=\"_blank\" rel=\"noopener\"> aid\u00e9 de \u00e7a.<\/a><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:syntaxhighlighter\/code {\"language\":\"python\"} --><\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">## import des librairies\nimport urllib.request\nimport re\nimport requests\n \n## d\u00e9finition des variables, on diff\u00e9rencie l'url de l'image, de l'URL qui nous permettra de retrouver le nom\nbaseURL_img = 'https:\/\/www.magic-ville.com\/pics\/big\/'\nbaseURL_name = 'https:\/\/www.magic-ville.com\/fr\/carte?ref=mrd'\n\n## on commence par la premi\u00e9re carte, on arr\u00eate \u00e0 la 180\u00e9me (la derni\u00e9re)\nstart = 1\n\n## on fait une boucle qui s'arr\u00eatera tout seul \u00e0 la derni\u00e9re carte de l'extension\nwhile start &gt;=1:\n\n    ## on va g\u00e9n\u00e9rer l'URL de la page \u00e0 scanner\n    newURL_name = baseURL_name +str(f'{start:03}')\n    \n    ## on r\u00e9cup\u00e9re le code HTML de la page \n    codeHTML = requests.get(newURL_name)\n    \n    ## On recherche toutes les balises S16 et on r\u00e9cup\u00e9re ce qu'il y a \u00e0 l'int\u00e9rieur (le nom de la carte)\n    Name = re.findall(r'&lt;div class=S16&gt;(.+)&lt;\/div&gt;',codeHTML.text)\n    Image = re.findall(r'&lt;img src=..\/pics\/big\/(.+)&gt;&lt;\/td&gt;&lt;\/tr&gt;',codeHTML.text)\n    \n    if \"FR\" in str(Image): \n    \n        ## On g\u00e9n\u00e9re de l'URL de l'image\n        newURL_img = baseURL_img + str(Image[0])\n        \n        ## On t\u00e9l\u00e9charge la carte\n        urllib.request.urlretrieve(newURL_img, str(Name[1])+'.jpg')\n        \n        ## On affiche ce qui se passe \u00e0 l'\u00e9cran et le nombre de carte restante\n        ## en cas d'erreur, c'est que c'est fini !\n        try:\n            print ('[',str(start),'] - T\u00e9l\u00e9chargement de', str(Name[1]))\n        except IndexError:\n            break\n        \n    else:\n        try:\n            print ('[',str(start),'] - Pas de scan en fran\u00e7ais - ', str(Name[1]) )\n        except IndexError:\n            break\n    \n     \n    ## On incr\u00e9mente start\n    start = start + 1\n\nprint('Extraction termin\u00e9e')<\/pre>\n<p><!-- \/wp:syntaxhighlighter\/code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Voil\u00e0 le r\u00e9sultat qu\u2019on obtient (y\u2019a que la fin hein !)<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>[ 300 ] - Pas de scan en fran\u00e7ais - Mountain\n[ 301 ] - Pas de scan en fran\u00e7ais - Mountain\n[ 302 ] - Pas de scan en fran\u00e7ais - Mountain\n[ 303 ] - Pas de scan en fran\u00e7ais - Forest\n[ 304 ] - Pas de scan en fran\u00e7ais - Forest\n[ 305 ] - Pas de scan en fran\u00e7ais - Forest\n[ 306 ] - Pas de scan en fran\u00e7ais - Forest\nExtraction termin\u00e9e<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Voil\u00e0, donc le code s\u2019arr\u00eate tout seul au lieu d\u2019afficher une erreur. Pas mal hein ?<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:heading {\"level\":3} --><\/p>\n<h3>\u00c9viter de t\u00e9l\u00e9charger une carte si on l\u2019a d\u00e9j\u00e0<\/h3>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Pour am\u00e9liorer encore mon petit bout de programme et acc\u00e9ler son \u00e9xecution, on peut v\u00e9rifier si l&rsquo;on a une carte ou non avant de la t\u00e9l\u00e9charger. Bon alors pour \u00e7a, j\u2019ai tout simplement rajout\u00e9 une condition en <a href=\"https:\/\/waytolearnx.com\/2019\/04\/comment-verifier-si-un-fichier-ou-un-dossier-existe-en-python.html\" target=\"_blank\" rel=\"noreferrer noopener\">m\u2019aidant de \u00e7a<\/a> et <a href=\"https:\/\/python.doctor\/page-gestion-fichiers-dossiers-python\" target=\"_blank\" rel=\"noreferrer noopener\">de \u00e7a.<\/a><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:syntaxhighlighter\/code {\"language\":\"python\"} --><\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">## import des librairies\nimport urllib.request\nimport re\nimport requests\nimport os.path\n\n\n## d\u00e9finition des variables, on diff\u00e9rencie l'url de l'image, de l'URL qui nous permettra de retrouver le nom\nbaseURL_img = 'https:\/\/www.magic-ville.com\/pics\/big\/'\nbaseURL_name = 'https:\/\/www.magic-ville.com\/fr\/carte?ref=fut'\n\n\n## on commence par la premi\u00e9re carte, on arr\u00eate \u00e0 la 180\u00e9me (la derni\u00e9re)\nstart = 1\n\n## on fait une boucle qui s'arr\u00eatera tout seul \u00e0 la derni\u00e9re carte de l'extension\nwhile start &gt;=1:\n    \n    ## on va g\u00e9n\u00e9rer l'URL de la page \u00e0 scanner\n    newURL_name = baseURL_name +str(f'{start:03}')\n    \n    ## on r\u00e9cup\u00e9re le code HTML de la page \n    codeHTML = requests.get(newURL_name)\n    \n    ## On recherche toutes les balises S16 et on r\u00e9cup\u00e9re ce qu'il y a \u00e0 l'int\u00e9rieur (le nom de la carte)\n    Name = re.findall(r'&lt;div class=S16&gt;(.+)&lt;\/div&gt;',codeHTML.text)\n    Image = re.findall(r'&lt;img src=..\/pics\/big\/(.+)&gt;&lt;\/td&gt;&lt;\/tr&gt;',codeHTML.text)\n    \n    ## Si le fichier n'existe pas, alors on va t\u00e9l\u00e9charger la carte\n    if not os.path.isfile(str(Name[1]+'.jpg')):\n            \n        if \"FR\" in str(Image):   \n            ## On g\u00e9n\u00e9re de l'URL de l'image\n            newURL_img = baseURL_img + str(Image[0])\n            \n            ## On t\u00e9l\u00e9charge la carte\n            urllib.request.urlretrieve(newURL_img, str(Name[1])+'.jpg')\n            ## On affiche ce qui se passe \u00e0 l'\u00e9cran et le nombre de carte restante\n            try:\n                print ('[',str(start),'] - T\u00e9l\u00e9chargement de', str(Name[1]))\n            except IndexError:\n                break\n        else:\n            try:\n                print ('[',str(start),'] - Pas de scan en fran\u00e7ais - ', str(Name[1]) )\n            except IndexError:\n                break\n    else:\n        print ('[',str(start),'] - La carte existe d\u00e9ja - ', str(Name[1]) )\n            \n    ## On incr\u00e9mente start\n    start = start + 1\n\nprint('Extraction termin\u00e9e')\n\n\n<\/pre>\n<p><!-- \/wp:syntaxhighlighter\/code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Voici un petit extrait de ce que l&rsquo;on obtiendrait si on avait des doublons :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>[ 19 ] - La carte existe d\u00e9ja -  Blade of the Sixth Pride\n[ 20 ] - La carte existe d\u00e9ja -  Bound in Silence\n[ 21 ] - La carte existe d\u00e9ja -  Daybreak Coronet\n[ 22 ] - La carte existe d\u00e9ja -  Goldmeadow Lookout\n[ 23 ] - T\u00e9l\u00e9chargement de Imperial Mask\n[ 24 ] - T\u00e9l\u00e9chargement de Lucent Liminid\n[ 25 ] - T\u00e9l\u00e9chargement de Lumithread Field\n[ 26 ] - T\u00e9l\u00e9chargement de Lymph Sliver<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Voici un petit extrait de ce que ca pourrait donner :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>[ 19 ] - La carte existe d\u00e9ja -  Blade of the Sixth Pride\n[ 20 ] - La carte existe d\u00e9ja -  Bound in Silence\n[ 21 ] - La carte existe d\u00e9ja -  Daybreak Coronet\n[ 22 ] - La carte existe d\u00e9ja -  Goldmeadow Lookout\n[ 23 ] - T\u00e9l\u00e9chargement de Imperial Mask\n[ 24 ] - T\u00e9l\u00e9chargement de Lucent Liminid\n[ 25 ] - T\u00e9l\u00e9chargement de Lumithread Field\n[ 26 ] - T\u00e9l\u00e9chargement de Lymph Sliver<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:heading {\"level\":3} --><\/p>\n<h3>Ne t\u00e9l\u00e9charger la carte que si elle n&rsquo;est pas disponnible en francais sur Scryfall.<\/h3>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Bon alors on a presque tout optimis\u00e9. Voil\u00e0 le dernier point . J&rsquo;ai r\u00e9fl\u00e9chis. J&rsquo;ai pas trouv\u00e9. En effet sur le site de Scryfall , rien n&rsquo;indique si l&rsquo;illustration est en Fran\u00e7ais ou en Anglais si ce n&rsquo;est : l&rsquo;image elle m\u00eame. Alors a moins de s&rsquo;amuser a faire de la reconnaissance automatique sur les images ; je vois pas comment on pourrait s&rsquo;y prendre. Et puis, ca serait une solution un peu de bourrin : c&rsquo;est tuer des mouches \u00e0 la catapulte&#8230;<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:heading {\"level\":1} --><\/p>\n<h1>Et maintenant ?<\/h1>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Alors voil\u00e0, j&rsquo;ai rempli mon objectif en a peine quelques heures&#8230; (Sachant que je codais, et qu&rsquo;en m\u00eame temps je r\u00e9digeais l&rsquo;article, tout en prenant des captures d&rsquo;\u00e9crans&#8230;)<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Est ce qu&rsquo;on pourrait pas aller plus loin et t\u00e9l\u00e9charger toutes les cartes en Francais de toutes les extensions ? Bon alors allons y !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2 id=\"finarticle\">Trouver la liste de toutes les extensions.<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>On l&rsquo;a vu, les cartes sont rang\u00e9s par extension et chaque extension est d\u00e9fini avec un trigramme. On avait vu que :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:list --><\/p>\n<ul>\n<li>FUT pour Future Sight<\/li>\n<li>MRD pour Mirrodin<\/li>\n<li>etc&#8230;<\/li>\n<\/ul>\n<p><!-- \/wp:list --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>L&rsquo;id\u00e9e serait donc d&rsquo;avoir la liste de tous les trigrammes et ainsi pouvoir balayer toutes les \u00e9ditions sur le site de MagicVille !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Il existe une telle liste, plus ou moins officielle, <a href=\"https:\/\/scryfall.com\/sets\">que l&rsquo;on retrouve sur Scryfall. <\/a> Seulement voil\u00e0, ca aurait \u00e9t\u00e9 trop simple. Il s&rsquo;av\u00e9re que MagicVille n&rsquo;utilise parfois pas les m\u00eames abr\u00e9viations que Scryfall. Un exemple parmis tant d&rsquo;autres : <strong>Lorwynn<\/strong> a pour trigramme <strong>LRW<\/strong> chez Scryfall, et <strong>LOR<\/strong> chez MagicVille. Du coup, je vais m&rsquo;amuser \u00e0 trier et \u00e0 v\u00e9rifier pour chaque trigramme si il est correct ou non.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>G\u00e9n\u00e9rer la liste des extensions<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Bon, maintenant qu&rsquo;on sait se d\u00e9brouiller avec du python, peut \u00eatre qu&rsquo;on pourrait g\u00e9n\u00e9rer cette liste \u00e0 partir du site MagicVille ? J&rsquo;ai pas mal cherch\u00e9 et j&rsquo;ai finis par trouver (avec l&rsquo;aide de mon ami Stef). En effet, le site MagicVille dispose d&rsquo;<a href=\"https:\/\/magic-ville.fr\/fr\/rech_avancee\" target=\"_blank\" rel=\"noreferrer noopener\">une page pour faire des recherches avanc\u00e9es<\/a>. Et c&rsquo;est en examinant le code contenu sur cette page que j&rsquo;ai trouv\u00e9 la perle rare !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:image {\"id\":1634,\"sizeSlug\":\"large\"} --><\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" class=\"wp-image-1634\" title=\"\" src=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/extension-1-1.png?w=830\" alt=\"\"><\/figure>\n<p><!-- \/wp:image --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>En effet, on voit dans cet exemple que chaque case \u00e0 cocher est reli\u00e9 \u00e0 une propri\u00e9t\u00e9, et \u00e0 chaque fois on retrouve le trigramme !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:list --><\/p>\n<ul>\n<li><strong>zen<\/strong> pour Zendikar<\/li>\n<li><strong>wwk<\/strong> pour Worldwake<\/li>\n<li><strong>roe<\/strong> pour L&rsquo;Ascencion des Eldrazi (Rise Of Eldrazi)<\/li>\n<\/ul>\n<p><!-- \/wp:list --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>On peut appliquer \u00e7a \u00e0 toutes les autres extensions : vous avez compris le principe ! Avec l&rsquo;aide de ce site j&rsquo;ai cr\u00e9\u00e9 ce tout petit bout de code :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:syntaxhighlighter\/code {\"language\":\"python\"} --><\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">import re\nimport requests\n\nextHTML = requests.get('https:\/\/magic-ville.fr\/fr\/rech_avancee')\n \n##On recherche tous les trigrammes\nEXT = re.findall('name=set_sel\\[(.*?)\\]', extHTML.text)\n \n## Voici tous les r\u00e9sultats :\nprint (EXT)\n \n<\/pre>\n<p><!-- \/wp:syntaxhighlighter\/code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Qui nous donne ce r\u00e9sultat l\u00e0 :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>['iko', 'thb', 'eld', 'grn', 'rna', 'war', 'dom', 'xln', 'rix', 'akh', 'hou', 'kld', 'aer', 'soi', 'emn', 'bfz', 'ogw', 'ktk', 'frf', 'dtk', 'ths', 'bng', 'jou', 'rtr', 'gtc', 'dgm', 'isd', 'dka', 'avr', 'som', 'mbs', 'nph', 'zen', 'wwk', 'roe', 'soa', 'con', 'alr', 'sha', 'eve', 'lor', 'mor', 'tsp', 'plc', 'fut', 'rav', 'gui', 'dis', 'chk', 'bek', 'sak', 'mrd', 'drs', 'fda', 'ons', 'lgi', 'sco', 'ody', 'tor', 'jud', 'inv', 'pla', 'apo', 'mer', 'nem', 'pro', 'urs', 'url', 'urd', 'tem', 'str', 'exo', 'mir', 'vis', 'wea', 'ice', 'all', 'col', 'm21', 'm20', 'm19', 'ori', '15m', '14m', '13m', '12m', '11m', '10m', 'xth', '9th', '8th', '7th', '6th', '5th', '4th', 'rev', 'abu', 'bet', 'alp', 'ss3', 'ss2', 'ss1', 'gs1', 'my3', 'my2', 'uma', 'myt', 'aki', 'kli', 'zex', 'eur', 'gur', 'apa', 'gra', 'fir', 'sli', 'und', 'ust', 'unh', 'ung', '2un', '2xm', 'q04', 'q03', 'myb', 'sld', 'q02', 'gk2', 'ulm', 'gk1', 'q01', '25m', 'ima', 'and', '17w', 'mmc', 'pad', 'ema', '16w', 'mmb', 'med', 'mma', '2pd', 'ard', 'dop', 'pcd', 'cst', 'dec', 'bea', 'bro', 'ath', 'i2p', 'chr', 'ren', 'sum', 'evi', 'mvg', 'mvm', 'nvo', 'bvc', 'zve', 'evk', 'dda', 'svc', 'jvv', 'hvm', 'svt', 'ivg', 'vvk', 'avn', 'kvd', 'evt', 'pvc', 'gvl', 'dvd', 'jvc', 'evg', 'jmp', 'c20', 'gn2', 'c19', 'mh1', 'gnt', 'c18', 'bbd', 'cm2', 'eoi', '17c', 'anb', 'can', 'pca', '16c', '2cn', '15c', '14c', 'cns', 'joc', 'bnc', 'thc', '13c', 'cma', '2pc', 'arc', 'pch', 'cmd', 'van', 'fnm', 'pre', 'pmo', 'dci', 'gat', 'rew', 'mpt', 'jss', 'are', 'aaa', 'uni', 'vir', 'ha3', 'ha2', 'ha1', 'ana', 'tpr', 'vma', '4me', '3me', '2me', '1me', 'hom', 'fal', 'dar', 'leg', 'ant', 'ara', 's2k', 'sta', 'ptk', 'psa', 'por', 'ftr', 'fvo', 'fva', 'anh', 'fvt', 'fre', 'fvl', 'fvr', 'fve', 'fvd']<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Il ne nous reste plus qu&rsquo;a int\u00e9gr\u00e9 ce petit bout de code dans le pr\u00e9c\u00e9dent, et on aura tout bon !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>Fuuuuuuuusion !<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Je me <a href=\"https:\/\/www.geeksforgeeks.org\/iterate-over-a-list-in-python\/\" target=\"_blank\" rel=\"noreferrer noopener\">suis aid\u00e9 de \u00e7a<\/a> ainsi de tout ce qu&rsquo;on a vu avant. J&rsquo;ai modifi\u00e9 un peu le code notamment au niveau des break. Car cette fois ci, une fois qu&rsquo;on a fini de scanner la premi\u00e9re extension, on passe \u00e0 la suivante ! Or on avait juste fait un systeme pour quitter le programme . C&rsquo;est pas ce qu&rsquo;on veut. En bricolant je suis donc arriv\u00e9 \u00e0 \u00e7a :<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:syntaxhighlighter\/code {\"language\":\"python\"} --><\/p>\n<pre class=\"wp-block-syntaxhighlighter-code\">## Programme en Python permettant de r\u00e9cup\u00e9rer les scans des cartes Magic en Francais depuis le site MagicVille\n\n## import des librairies\nimport urllib.request\nimport re\nimport requests\nimport os.path\n\n## d\u00e9finition des variables, on diff\u00e9rencie l'url de l'image, de l'URL qui nous permettra de retrouver le nom\nbaseURL_img = 'https:\/\/www.magic-ville.com\/pics\/big\/'\nbaseURL_name = 'https:\/\/www.magic-ville.com\/fr\/carte?ref='\n\n## On r\u00e9cup\u00e9re le code HTML de la page contenant toutes les extensions\nextHTML = requests.get('https:\/\/magic-ville.fr\/fr\/rech_avancee')\n## On r\u00e9cup\u00e9re uniquement la liste de toutes les extensions (trigrammes)\nEXT_list = re.findall('name=set_sel\\[(.*?)\\]', extHTML.text)\n\n## Pour chaque extension dans la liste\nfor i in EXT_list:\n    EXT_name = i\n    \n    ## on commence par la premi\u00e9re carte\n    start = 1\n    fin = 0\n    \n    ## on fait une boucle qui s'arr\u00eatera tout seul \u00e0 la derni\u00e9re carte de l'extension\n    while fin == 0:\n        \n        ## on va g\u00e9n\u00e9rer l'URL de la page \u00e0 scanner\n        newURL_name = baseURL_name + i +str(f'{start:03}')\n        \n        ## on r\u00e9cup\u00e9re le code HTML de la page \n        codeHTML = requests.get(newURL_name)\n        \n        ## Dans ce code, on recherche le nom de la carte, et son image.\n        try :\n            Name = re.findall(r'&lt;div class=S16&gt;(.+)&lt;\/div&gt;',codeHTML.text)\n        except IndexError:\n            pass\n        \n        try :\n            Image = re.findall(r'&lt;img src=..\/pics\/big\/(.+)&gt;&lt;\/td&gt;&lt;\/tr&gt;',codeHTML.text)\n        except :\n            pass\n        \n        ## On v\u00e9rifie que l'on est pas arriv\u00e9 \u00e0 la fin de l'extension\n        try:\n            print(Name[1])\n        except IndexError:\n            fin = 1\n            pass\n        else:\n            ## Si on ne poss\u00e9de pas d\u00e9ja ce fichier, alors on va t\u00e9l\u00e9charger la carte\n            if not os.path.isfile(str(Name[1]+'.jpg')):\n                    \n                if \"FR\" in str(Image):   \n                    ## On g\u00e9n\u00e9re de l'URL de l'image\n                    newURL_img = baseURL_img + str(Image[0])\n                    \n                    ## On t\u00e9l\u00e9charge la carte\n                    try:\n                        urllib.request.urlretrieve(newURL_img, str(Name[1])+'.jpg')\n                    except:\n                        pass\n                    \n                    ## Message\n                    print ('[',str(start),'-',str(i),'] - T\u00e9l\u00e9chargement du scan')\n    \n                else:\n                    ## Message\n                    print ('[',str(start),'-',str(i),'] - Pas de scan en fran\u00e7ais - ')\n    \n            else:\n                ## Message\n                print ('[',str(start),'-',str(i),'] - Le scan existe d\u00e9ja - ')\n                    \n        ## On incr\u00e9mente start\n        start = start + 1\n    \nprint('Extraction termin\u00e9e')\n\n\n<\/pre>\n<p><!-- \/wp:syntaxhighlighter\/code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>J&rsquo;ai eu quelques petites probl\u00e9mes, notamment <a href=\"https:\/\/magic-ville.fr\/fr\/carte?ref=eld292\">avec des cartes comme celle ci. <\/a><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Comme vous le voyez, il n&rsquo;y a pas deux balises S16 sur cette page mais 4 ! Du coup, lorsqu&rsquo;on demande de prendre le nom de la deuxi\u00e9me balise on prend <strong>D\u00e9monstration de combat<\/strong> au lieu de <strong>Embereth Shieldbreaker<\/strong><br>\nEncore un truc qu&rsquo;on pourrait am\u00e9liorer &#8230;Mais j&rsquo;en ai d\u00e9ja assez fait ! Evidemment je ne garanti pas du r\u00e9sultat, j&rsquo;ai parfois des erreurs qui font tout planter&#8230; Pour \u00e9viter \u00e7a , j&rsquo;ai mis des \u00ab\u00a0pass\u00a0\u00bb un peu partout pour ignorer les erreurs&#8230; Tant pis si on perd quelques cartes en route&#8230;<\/p>\n<p>&nbsp;<\/p>\n<h1>Conclusion et liens de t\u00e9l\u00e9chargement<\/h1>\n<p>Bon ben j&rsquo;ai r\u00e9ussi ! J&rsquo;ai lanc\u00e9 le script et il a mis environ 3h30 pour t\u00e9l\u00e9charger environ 12.000 images (~500 mo)\u00a0 &#8230; C&rsquo;est long, il faudra optimiser \u00e7a \u00e0 l&rsquo;occasion.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2>Le .py<\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>D&rsquo;autre part : voici le fichier et vous amuser avec. Faites attention \u00e0 pas trop envoyer de requ\u00eate sur le site pour \u00e9viter les probl\u00e9mes !<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p><a href=\"https:\/\/blog.nanuq.me\/wp-content\/uploads\/2020\/06\/magic.zip\">Le .zip de magic !<\/a><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\uddd3\ufe0f Note : Cet article est une archive import\u00e9e de mon ancien blog. Certaines informations peuvent ne plus \u00eatre \u00e0 jour. Ou comment faire du&#8230;<\/p>\n","protected":false},"author":1,"featured_media":1488,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2,4],"tags":[68,81,95],"_links":{"self":[{"href":"https:\/\/blog.nanuq.me\/index.php?rest_route=\/wp\/v2\/posts\/1481"}],"collection":[{"href":"https:\/\/blog.nanuq.me\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.nanuq.me\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.nanuq.me\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.nanuq.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1481"}],"version-history":[{"count":0,"href":"https:\/\/blog.nanuq.me\/index.php?rest_route=\/wp\/v2\/posts\/1481\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.nanuq.me\/index.php?rest_route=\/"}],"wp:attachment":[{"href":"https:\/\/blog.nanuq.me\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1481"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.nanuq.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1481"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.nanuq.me\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1481"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}