{ "nbformat": 4, "nbformat_minor": 5, "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.2" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false }, "colab": { "name": "MAL List Creator.ipynb", "provenance": [], "include_colab_link": true } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "code", "metadata": { "id": "BMsVtZfdd0yQ" }, "source": [ "# installing some packages\n", "!pip3 install dicttoxml\n", "!pip3 install xmltodict\n", "!pip3 install jikanpy" ], "id": "BMsVtZfdd0yQ", "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "bEZNZYficvJP" }, "source": [ "from google.colab import files\n", "import pandas as pd\n", "from dicttoxml import dicttoxml\n", "import xmltodict, json\n", "import xml.etree.ElementTree as ET\n", "from xml.dom import minidom\n", "from jikanpy import Jikan\n", "import time" ], "id": "bEZNZYficvJP", "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "resources": { "http://localhost:8080/nbextensions/google.colab/files.js": { "data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7CgpmdW5jdGlvbiBfdXBsb2FkRmlsZXMoaW5wdXRJZCwgb3V0cHV0SWQpIHsKICBjb25zdCBzdGVwcyA9IHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCk7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICAvLyBDYWNoZSBzdGVwcyBvbiB0aGUgb3V0cHV0RWxlbWVudCB0byBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgdGhlIG5leHQgY2FsbAogIC8vIHRvIHVwbG9hZEZpbGVzQ29udGludWUgZnJvbSBQeXRob24uCiAgb3V0cHV0RWxlbWVudC5zdGVwcyA9IHN0ZXBzOwoKICByZXR1cm4gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpOwp9CgovLyBUaGlzIGlzIHJvdWdobHkgYW4gYXN5bmMgZ2VuZXJhdG9yIChub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIHlldCksCi8vIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSBhc3luY2hyb25vdXMgc3RlcHMgYW5kIHRoZSBQeXRob24gc2lkZSBpcyBnb2luZwovLyB0byBwb2xsIGZvciBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcC4KLy8gVGhpcyB1c2VzIGEgUHJvbWlzZSB0byBibG9jayB0aGUgcHl0aG9uIHNpZGUgb24gY29tcGxldGlvbiBvZiBlYWNoIHN0ZXAsCi8vIHRoZW4gcGFzc2VzIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHN0ZXAgYXMgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHN0ZXAuCmZ1bmN0aW9uIF91cGxvYWRGaWxlc0NvbnRpbnVlKG91dHB1dElkKSB7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICBjb25zdCBzdGVwcyA9IG91dHB1dEVsZW1lbnQuc3RlcHM7CgogIGNvbnN0IG5leHQgPSBzdGVwcy5uZXh0KG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSk7CiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXh0LnZhbHVlLnByb21pc2UpLnRoZW4oKHZhbHVlKSA9PiB7CiAgICAvLyBDYWNoZSB0aGUgbGFzdCBwcm9taXNlIHZhbHVlIHRvIG1ha2UgaXQgYXZhaWxhYmxlIHRvIHRoZSBuZXh0CiAgICAvLyBzdGVwIG9mIHRoZSBnZW5lcmF0b3IuCiAgICBvdXRwdXRFbGVtZW50Lmxhc3RQcm9taXNlVmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiBuZXh0LnZhbHVlLnJlc3BvbnNlOwogIH0pOwp9CgovKioKICogR2VuZXJhdG9yIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBiZXR3ZWVuIGVhY2ggYXN5bmMgc3RlcCBvZiB0aGUgdXBsb2FkCiAqIHByb2Nlc3MuCiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIGlucHV0IGZpbGUgcGlja2VyIGVsZW1lbnQuCiAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXRJZCBFbGVtZW50IElEIG9mIHRoZSBvdXRwdXQgZGlzcGxheS4KICogQHJldHVybiB7IUl0ZXJhYmxlPCFPYmplY3Q+fSBJdGVyYWJsZSBvZiBuZXh0IHN0ZXBzLgogKi8KZnVuY3Rpb24qIHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpOwogIGlucHV0RWxlbWVudC5kaXNhYmxlZCA9IGZhbHNlOwoKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIG91dHB1dEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7CgogIGNvbnN0IHBpY2tlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7CiAgICAgIHJlc29sdmUoZS50YXJnZXQuZmlsZXMpOwogICAgfSk7CiAgfSk7CgogIGNvbnN0IGNhbmNlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIGlucHV0RWxlbWVudC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGNhbmNlbCk7CiAgY2FuY2VsLnRleHRDb250ZW50ID0gJ0NhbmNlbCB1cGxvYWQnOwogIGNvbnN0IGNhbmNlbFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgY2FuY2VsLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9OwogIH0pOwoKICAvLyBXYWl0IGZvciB0aGUgdXNlciB0byBwaWNrIHRoZSBmaWxlcy4KICBjb25zdCBmaWxlcyA9IHlpZWxkIHsKICAgIHByb21pc2U6IFByb21pc2UucmFjZShbcGlja2VkUHJvbWlzZSwgY2FuY2VsUHJvbWlzZV0pLAogICAgcmVzcG9uc2U6IHsKICAgICAgYWN0aW9uOiAnc3RhcnRpbmcnLAogICAgfQogIH07CgogIGNhbmNlbC5yZW1vdmUoKTsKCiAgLy8gRGlzYWJsZSB0aGUgaW5wdXQgZWxlbWVudCBzaW5jZSBmdXJ0aGVyIHBpY2tzIGFyZSBub3QgYWxsb3dlZC4KICBpbnB1dEVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlOwoKICBpZiAoIWZpbGVzKSB7CiAgICByZXR1cm4gewogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgICAgfQogICAgfTsKICB9CgogIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgewogICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOwogICAgbGkuYXBwZW5kKHNwYW4oZmlsZS5uYW1lLCB7Zm9udFdlaWdodDogJ2JvbGQnfSkpOwogICAgbGkuYXBwZW5kKHNwYW4oCiAgICAgICAgYCgke2ZpbGUudHlwZSB8fCAnbi9hJ30pIC0gJHtmaWxlLnNpemV9IGJ5dGVzLCBgICsKICAgICAgICBgbGFzdCBtb2RpZmllZDogJHsKICAgICAgICAgICAgZmlsZS5sYXN0TW9kaWZpZWREYXRlID8gZmlsZS5sYXN0TW9kaWZpZWREYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24vYSd9IC0gYCkpOwogICAgY29uc3QgcGVyY2VudCA9IHNwYW4oJzAlIGRvbmUnKTsKICAgIGxpLmFwcGVuZENoaWxkKHBlcmNlbnQpOwoKICAgIG91dHB1dEVsZW1lbnQuYXBwZW5kQ2hpbGQobGkpOwoKICAgIGNvbnN0IGZpbGVEYXRhUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4gewogICAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTsKICAgICAgfTsKICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpOwogICAgfSk7CiAgICAvLyBXYWl0IGZvciB0aGUgZGF0YSB0byBiZSByZWFkeS4KICAgIGxldCBmaWxlRGF0YSA9IHlpZWxkIHsKICAgICAgcHJvbWlzZTogZmlsZURhdGFQcm9taXNlLAogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbnRpbnVlJywKICAgICAgfQogICAgfTsKCiAgICAvLyBVc2UgYSBjaHVua2VkIHNlbmRpbmcgdG8gYXZvaWQgbWVzc2FnZSBzaXplIGxpbWl0cy4gU2VlIGIvNjIxMTU2NjAuCiAgICBsZXQgcG9zaXRpb24gPSAwOwogICAgd2hpbGUgKHBvc2l0aW9uIDwgZmlsZURhdGEuYnl0ZUxlbmd0aCkgewogICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihmaWxlRGF0YS5ieXRlTGVuZ3RoIC0gcG9zaXRpb24sIE1BWF9QQVlMT0FEX1NJWkUpOwogICAgICBjb25zdCBjaHVuayA9IG5ldyBVaW50OEFycmF5KGZpbGVEYXRhLCBwb3NpdGlvbiwgbGVuZ3RoKTsKICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoOwoKICAgICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNodW5rKSk7CiAgICAgIHlpZWxkIHsKICAgICAgICByZXNwb25zZTogewogICAgICAgICAgYWN0aW9uOiAnYXBwZW5kJywKICAgICAgICAgIGZpbGU6IGZpbGUubmFtZSwKICAgICAgICAgIGRhdGE6IGJhc2U2NCwKICAgICAgICB9LAogICAgICB9OwogICAgICBwZXJjZW50LnRleHRDb250ZW50ID0KICAgICAgICAgIGAke01hdGgucm91bmQoKHBvc2l0aW9uIC8gZmlsZURhdGEuYnl0ZUxlbmd0aCkgKiAxMDApfSUgZG9uZWA7CiAgICB9CiAgfQoKICAvLyBBbGwgZG9uZS4KICB5aWVsZCB7CiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICB9CiAgfTsKfQoKc2NvcGUuZ29vZ2xlID0gc2NvcGUuZ29vZ2xlIHx8IHt9OwpzY29wZS5nb29nbGUuY29sYWIgPSBzY29wZS5nb29nbGUuY29sYWIgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYi5fZmlsZXMgPSB7CiAgX3VwbG9hZEZpbGVzLAogIF91cGxvYWRGaWxlc0NvbnRpbnVlLAp9Owp9KShzZWxmKTsK", "ok": true, "headers": [ [ "content-type", "application/javascript" ] ], "status": 200, "status_text": "" } }, "base_uri": "https://localhost:8080/", "height": 89 }, "id": "lesser-creature", "outputId": "1c168edc-6847-4172-a9af-04c7bc86e780" }, "source": [ "uploaded = files.upload()\n", "\n", "# Here you need to upload the 9anime export.txt file.\n", "# It should contain MAL urls of the anime in your history.\n", "for fn in uploaded.keys():\n", " print('User uploaded file \"{name}\" with length {length} bytes'.format(\n", " name=fn, length=len(uploaded[fn])))" ], "id": "lesser-creature", "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "\n", " \n", " \n", " Upload widget is only available when the cell has been executed in the\n", " current browser session. Please rerun this cell to enable.\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "Saving export.txt to export.txt\n", "User uploaded file \"export.txt\" with length 189 bytes\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "composite-regular" }, "source": [ "# Next, we access the MAL id(s) from the urls\n", "NineAnimeList = pd.read_csv('./export.txt', names=['url'])\n", "metaData = (NineAnimeList['url'].str.split('/')).apply(pd.Series)\n", "\n", "anime = pd.DataFrame()\n", "\n", "# The anime list dataset\n", "anime['id'] = metaData[4] # this is all that we'll need.\n", "anime['name'] = metaData[5]\n", "anime['url'] = NineAnimeList['url']" ], "id": "composite-regular", "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 111 }, "id": "cfxaETiGejTj", "outputId": "ebf9cde0-a7c9-4f07-81c1-090233f6430d" }, "source": [ "# Here's how it should look\n", "anime.head(2)" ], "id": "cfxaETiGejTj", "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idnameurl
028171Shokugeki_no_Soumahttp://myanimelist.net/anime/28171/Shokugeki_n...
138691Dr_Stonehttp://myanimelist.net/anime/38691/Dr_Stone
\n", "
" ], "text/plain": [ " id name url\n", "0 28171 Shokugeki_no_Souma http://myanimelist.net/anime/28171/Shokugeki_n...\n", "1 38691 Dr_Stone http://myanimelist.net/anime/38691/Dr_Stone" ] }, "metadata": { "tags": [] }, "execution_count": 5 } ] }, { "cell_type": "code", "metadata": { "id": "painted-interaction" }, "source": [ "# Required fields for the XML file. All of methods go into the MAL class.\n", "# If you know what you are doing feel free to edit the animeMeta dictionary.\n", "# For example you can change the my_start_date and my_finish_date to today() or \n", "# import a separate series and feed it to the for loop inside the createDictList \n", "# function with a date argument added in animeDetails.\n", "\n", "class MAL():\n", " def __init__(self, user_id, user_name):\n", " self.user_id = user_id\n", " self.user_name = user_name\n", " self.jikan = Jikan()\n", " self.MALdict = None\n", " self.MALxml = None\n", "\n", " def animeDetails(self, id):\n", " # We will use the Jikan API with the anime id(s) to acquire additional information on the shows.\n", " # The jikan request rate limit is 1 request/2s (30 requests/minute).\n", " # I'll use 2.1s delay between requests just to be safe.\n", " # For 400 anime it should take exactly 14m\n", " time.sleep(2.1)\n", " series = self.jikan.anime(id)\n", " animeMeta = {\n", " 'series_animedb_id': series['mal_id'],\n", " 'series_title': series['title'],\n", " 'series_type': series['type'],\n", " 'series_episodes': series['episodes'],\n", " 'my_id': 0,\n", " 'my_watched_episodes': series['episodes'],\n", " 'my_start_date': '0000-00-00',\n", " 'my_finish_date': '0000-00-00',\n", " 'my_rated': None,\n", " 'my_score': None,\n", " 'my_storage': None,\n", " 'my_storage_value': 0.00,\n", " 'my_status': 'Completed',\n", " 'my_comments': None,\n", " 'my_times_watched': 0,\n", " 'my_rewatch_value': None,\n", " 'my_priority': 'LOW',\n", " 'my_tags': None,\n", " 'my_rewatching': 0,\n", " 'my_rewatching_ep': 0,\n", " 'my_discuss': 1,\n", " 'my_sns': 'default',\n", " 'update_on_import': 1}\n", " return animeMeta\n", "\n", " def createDictList(self, animeIDs):\n", " myinfo = {'user_id': self.user_id,\n", " 'user_name': self.user_name,\n", " 'user_export_type': '1',\n", " 'user_total_anime': len(animeIDs),\n", " 'user_total_watching': '0',\n", " 'user_total_completed': len(animeIDs),\n", " 'user_total_onhold': '0',\n", " 'user_total_dropped': '0',\n", " 'user_total_plantowatch': '0'}\n", "\n", " # Collecting all of the details json files into a single list\n", " anime = []\n", " for seriesID in animeIDs:\n", " anime.append(self.animeDetails(seriesID))\n", "\n", " # Constructing the main object\n", " MALdict = {\n", " 'myanimelist': {\n", " 'myinfo': myinfo,\n", " 'anime': anime}}\n", "\n", " self.MALdict = MALdict\n", " return MALdict\n", "\n", " def dictToMALxml(self, animeDict):\n", " # Converts a dict into an MAL xml file\n", " def itemName(arg):\n", " return 'anime'\n", "\n", " # A small bug caused by the inherent differences between json and xml datatypes.\n", " # In json you can't reuse a key twice, while the same is not true for xml file.\n", " animeDict['myanimelist']['CustomRemoval'] = animeDict['myanimelist'].pop(\n", " 'anime')\n", "\n", " xml = dicttoxml(animeDict['myanimelist'], root=True, custom_root='myanimelist', ids=False,\n", " attr_type=False, item_func=itemName)\n", "\n", " # Removing a key due the json->xml bug\n", " xml = xml.replace(b'', b'')\n", " xml = xml.replace(b'', b'')\n", "\n", " MALxml = minidom.parseString(xml).toprettyxml(indent=\" \")\n", " self.MALxml = MALxml\n", " return MALxml\n", " \n", " def createMALxml(self, animeIDs):\n", " self.createDictList(animeIDs)\n", " self.dictToMALxml(self.MALdict)\n", " return self.MALxml" ], "id": "painted-interaction", "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "neural-filename", "outputId": "93880175-546c-48a4-dad3-c144bf6eeec3" }, "source": [ "# Usage\n", "\n", "# You don't actually need to specify an id or a username. \n", "# As of now the site fixes the issue for you. So you can leave this as is.\n", "mal = MAL(user_id='1234', user_name='John Joe')\n", "MALxml = mal.createMALxml(anime['id'])\n", "\n", "# Writting the MALxml into a file\n", "with open(\"./MAL.xml\", \"w\") as f:\n", " f.write(MALxml)\n", "\n", "# Print to view the final output (or check the file directly)\n", "# If you are in google colab click the folder icon on the right.\n", "# You should see a file named MAL.xml on the left. Right click and download.\n", "# Now go to https://myanimelist.net/import.php and upload the file.\n", "# You are done!\n", "print(MALxml)" ], "id": "neural-filename", "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "\n", "\n", " \n", " 1234\n", " John Joe\n", " 1\n", " 4\n", " 0\n", " 4\n", " 0\n", " 0\n", " 0\n", " \n", " \n", " 28171\n", " Shokugeki no Souma\n", " TV\n", " 24\n", " 0\n", " 24\n", " 0000-00-00\n", " 0000-00-00\n", " \n", " \n", " \n", " 0.0\n", " Completed\n", " \n", " 0\n", " \n", " LOW\n", " \n", " 0\n", " 0\n", " 1\n", " default\n", " 1\n", " \n", " \n", " 38691\n", " Dr. Stone\n", " TV\n", " 24\n", " 0\n", " 24\n", " 0000-00-00\n", " 0000-00-00\n", " \n", " \n", " \n", " 0.0\n", " Completed\n", " \n", " 0\n", " \n", " LOW\n", " \n", " 0\n", " 0\n", " 1\n", " default\n", " 1\n", " \n", " \n", " 32182\n", " Mob Psycho 100\n", " TV\n", " 12\n", " 0\n", " 12\n", " 0000-00-00\n", " 0000-00-00\n", " \n", " \n", " \n", " 0.0\n", " Completed\n", " \n", " 0\n", " \n", " LOW\n", " \n", " 0\n", " 0\n", " 1\n", " default\n", " 1\n", " \n", " \n", " 2167\n", " Clannad\n", " TV\n", " 23\n", " 0\n", " 23\n", " 0000-00-00\n", " 0000-00-00\n", " \n", " \n", " \n", " 0.0\n", " Completed\n", " \n", " 0\n", " \n", " LOW\n", " \n", " 0\n", " 0\n", " 1\n", " default\n", " 1\n", " \n", "\n", "\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "iKy2-JqRikgY" }, "source": [ "PS: It took me three hours to finish writing and implementing the code, but even so, mistakes aren't something we can intentionally prevent, so watch out for bugs." ], "id": "iKy2-JqRikgY" } ] }