{ "cells": [ { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from collections.abc import Generator\n", "from io import BytesIO\n", "\n", "import requests\n", "from PIL import Image\n", "\n", "\n", "class Cat:\n", " \"\"\"Cat object storing the request data and image file from the cat API.\"\"\"\n", "\n", " def __init__(self, id, url, width, height):\n", " self.id = id\n", " self.url = url\n", " self.width = width\n", " self.height = height\n", " self._image = get_cat_image(url)\n", "\n", " def get_image(self) -> Image:\n", " \"\"\"Return the image of the cat object, cropped correctly if the width and height are changed.\n", "\n", " Returns:\n", " Image: Image object that has been edited by the crop function.\n", " \"\"\"\n", " if (self.width, self.height) != self._image.size:\n", " return self._image.resize((self.width, self.height))\n", " return self._image\n", "\n", " def save_image(self, path: str) -> bool:\n", " \"\"\"Save image in cat to disk\n", "\n", " Args:\n", " path (str): the path to save the cat picture to.\n", "\n", " Returns:\n", " bool: return if the function executed correctly, passthrough of the save function of Image.\n", " \"\"\"\n", " return self.get_image().save(f\"{path}/{self.id}.png\")\n", "\n", "\n", "def get_cat_data(count: int = 1) -> list[dict]:\n", " \"\"\"Fetch a cat from the cat API, return a parsed JSON object.\n", "\n", " Args:\n", " count (int): the amount of cats to return.\n", "\n", " Returns:\n", " list[dict]: Returns the parsed data, the cat API returns a list with length 1 with a dict in it.\n", " \"\"\"\n", " response = requests.get(f\"https://api.thecatapi.com/v1/images/search?limit={count}\")\n", " if response.status_code != 200:\n", " return None\n", " return response.json()\n", "\n", "\n", "def get_cats(cat_json: list[dict]) -> Generator[Cat]:\n", " \"\"\"Create a cat image from a JSON object formatted like the cat API\n", "\n", " Args:\n", " cat_json (list[dict]): Expects a list with a length > 1 with dicts in it that contains at least the fields:\n", " (str) id\n", " (str) url\n", " (str) width\n", " (str) height\n", "\n", " Returns:\n", " Generator[Cat]: A Generator object creating cat objects from the JSON object.\n", " \"\"\"\n", "\n", " for cat in cat_json:\n", " yield Cat(\n", " cat.get(\"id\"),\n", " cat.get(\"url\"),\n", " cat.get(\"width\"),\n", " cat.get(\"height\"),\n", " )\n", "\n", "\n", "def get_cat_image(url: str) -> Image:\n", " \"\"\"Fetch an image url of the cat provided, returns an image file.\n", "\n", " Args:\n", " url (str): the amount of cats to return.\n", "\n", " Returns:\n", " Image: An image file parsed with the PIL library, read from a bytestream from the cats API.\n", " \"\"\"\n", " cr = requests.get(url)\n", " if cr.status_code != 200:\n", " print(f\"Error fetching cat image, error code {cr.status_code}\")\n", " return None\n", " return Image.open(BytesIO(cr.content))\n", "\n", "\n", "cats = get_cats(get_cat_data(count=5))\n", "for cat in cats:\n", " cat.height = 720\n", " cat.width = 1080\n", " cat.save_image(\"./cats\")" ] } ], "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.11.8" } }, "nbformat": 4, "nbformat_minor": 2 }