129 lines
4.1 KiB
Plaintext
129 lines
4.1 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 106,
|
|
"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) -> bool:\n",
|
|
" \"\"\"Save image in cat to disk\n",
|
|
"\n",
|
|
" Args:\n",
|
|
" path (String): 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=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) -> 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",
|
|
" (String) id\n",
|
|
" (String) url\n",
|
|
" (String) width\n",
|
|
" (String) 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) -> Image:\n",
|
|
" \"\"\"Fetch an image of the cat provided, returns an image file.\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
|
|
}
|