diff --git a/README.md b/README.md deleted file mode 100644 index 6b32f34..0000000 --- a/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# PyCBZHelper - -[![License](https://img.shields.io/github/license/hyugogirubato/pycbzhelper)](https://github.com/hyugogirubato/pycbzhelper/blob/main/LICENSE) -[![Release](https://img.shields.io/github/release-date/hyugogirubato/pycbzhelper)](https://github.com/hyugogirubato/pycbzhelper/releases) -[![Latest Version](https://img.shields.io/pypi/v/pycbzhelper)](https://pypi.org/project/pycbzhelper/) - -PyCBZHelper is a Python library for creating CBZ (Comic Book Zip) files with metadata. It provides functionality to -generate a CBZ file from a list of image pages and associated comic book metadata. - -## Features - -- Create CBZ files from images. -- Generate ComicInfo.xml metadata. -- Support for various metadata fields. -- Handle page files from local disk or web URLs. -- Automatic cleanup of temporary files. - -## Installation - -You can install PyCBZHelper using pip: - -````shell -pip install pycbzhelper -```` - -## Usage - -Here's a basic example of how to use PyCBZHelper: - -````python -from pycbzhelper import Helper -from pathlib import Path - -PARENT = Path(__name__).resolve().parent - -if __name__ == "__main__": - # Define metadata for the comic - metadata = { - "Title": "My Comic", - "Series": "Comic Series", - "Number": "1", - "Pages": [ - {"File": PARENT / "image1.jpg"}, - {"File": PARENT / "image2.jpg"}, - ] - # Add more metadata fields here - } - - # Define the path to the output CBZ file - output_path = PARENT / "output.cbz" - - # Create an instance of the Helper class - helper = Helper(metadata) - - # Create the CBZ file - helper.create_cbz(output_path) -```` - -For more information on how to use PyCBZHelper, please refer to -the [documentation](https://github.com/hyugogirubato/pycbzhelper/blob/main/docs/schema). - -### Exceptions - -The following exceptions can be raised by PyCBZHelper: - -- `InvalidKeyValue`: Raised when a key value is invalid. -- `MissingPageFile`: Raised when no page files are available. -- `InvalidFileExtension`: Raised when an invalid file extension is used. -- `FileNotFound`: Raised when the specified source file is not found. - -### License - -This project is licensed under the [GPL v3 License](https://github.com/hyugogirubato/pycbzhelper/blob/main/LICENSE). diff --git a/cbzProject/.gitignore b/cbzProject/.gitignore new file mode 100644 index 0000000..cb5660a --- /dev/null +++ b/cbzProject/.gitignore @@ -0,0 +1,176 @@ +# Created by https://www.toptal.com/developers/gitignore/api/python +# Edit at https://www.toptal.com/developers/gitignore?templates=python + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ + +### Python Patch ### +# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration +poetry.toml + +# ruff +.ruff_cache/ + +# LSP config files +pyrightconfig.json + +# End of https://www.toptal.com/developers/gitignore/api/python \ No newline at end of file diff --git a/CHANGELOG.md b/cbzProject/CHANGELOG.md similarity index 57% rename from CHANGELOG.md rename to cbzProject/CHANGELOG.md index 579b2f2..4cfb71b 100644 --- a/CHANGELOG.md +++ b/cbzProject/CHANGELOG.md @@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [3.2.0] - 2024-03-17 + +### Changed + +- New code structure. +- Deleting temporary files usage. +- Automatic correction of variable types. +- Simplifying constants. +- Binary input support for pages. +- Project `pycbzhelper` renamed to `cbz`. + ## [3.1.2] - 2023-08-13 ### Fixed @@ -42,7 +53,8 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Initial release. -[3.1.2]: https://github.com/hyugogirubato/pycbzhelper/releases/tag/v3.1.2 -[3.1.1]: https://github.com/hyugogirubato/pycbzhelper/releases/tag/v3.1.1 -[3.1.0]: https://github.com/hyugogirubato/pycbzhelper/releases/tag/v3.1.0 -[3.0.1]: https://github.com/hyugogirubato/pycbzhelper/releases/tag/v3.0.1 +[3.2.0]: https://github.com/hyugogirubato/cbz/releases/tag/v3.2.0 +[3.1.2]: https://github.com/hyugogirubato/cbz/releases/tag/v3.1.2 +[3.1.1]: https://github.com/hyugogirubato/cbz/releases/tag/v3.1.1 +[3.1.0]: https://github.com/hyugogirubato/cbz/releases/tag/v3.1.0 +[3.0.1]: https://github.com/hyugogirubato/cbz/releases/tag/v3.0.1 diff --git a/LICENSE b/cbzProject/LICENSE similarity index 100% rename from LICENSE rename to cbzProject/LICENSE diff --git a/cbzProject/README.md b/cbzProject/README.md new file mode 100644 index 0000000..0d5d221 --- /dev/null +++ b/cbzProject/README.md @@ -0,0 +1,74 @@ +# CBZ + +[![License](https://img.shields.io/github/license/hyugogirubato/cbz)](https://github.com/hyugogirubato/cbz/blob/main/LICENSE) +[![Release](https://img.shields.io/github/release-date/hyugogirubato/cbz)](https://github.com/hyugogirubato/cbz/releases) +[![Latest Version](https://img.shields.io/pypi/v/cbz)](https://pypi.org/project/cbz/) + +CBZ is a Python package designed to facilitate the creation, manipulation, and extraction of comic book archive files in the CBZ format. It allows users to programmatically generate CBZ files from a collection of images, add metadata to the archives, and unpack existing CBZ files. This library is ideal for comic book enthusiasts, archivists, and developers working on applications involving digital comic book distributions. + +## Features + +- **Create CBZ Files**: Pack a series of images into a CBZ file with ease. +- **Extract CBZ Files**: Unpack images and metadata from existing CBZ files. +- **Manage Metadata**: Add, update, and retrieve metadata from CBZ files, including titles, authors, volume numbers, and more. +- **Support for ComicInfo.xml**: Utilizes the ComicInfo.xml standard for embedding comic book metadata within CBZ files. +- **Flexible Image Handling**: Load images from various formats and ensure they are correctly formatted and ordered within the CBZ file. +- **High-Level API**: Offers a simple, high-level API for common tasks, while also providing access to lower-level functions for advanced usage. + +## Installation + +To install the CBZ Library, you can use pip: + +```bash +pip install cbz +``` + +## Quick Start + +Here's a quick example of how to create a CBZ file from a series of images: + +```python +from pathlib import Path +from cbz.page import PageInfo +from cbz.comic import ComicInfo +from cbz.constants import PageType, YesNo, Manga, AgeRating, Format + +if __name__ == '__main__': + # Define the path to your images + images_path = Path('path/to/your/images') + + # Load images and create page objects + pages = [PageInfo.load(path) for path in images_path.iterdir()] + + # Create a ComicInfo object with your comic's metadata + comic = ComicInfo.from_pages( + pages=pages, + title='Your Comic Title', + series='Your Comic Series', + number='1', + language_iso='en', + format=Format.WEB_COMIC, + black_white=YesNo.NO, + manga=Manga.NO, + age_rating=AgeRating.PENDING + ) + + # Pack the comic into a CBZ file + cbz_content = comic.pack() + + # Save the CBZ file + cbz_path = Path('your_comic.cbz') + cbz_path.write_bytes(cbz_content) +``` + +## Documentation + +For detailed documentation, including the full API reference and more examples, please refer to the [official CBZ Library documentation](https://en.wikipedia.org/wiki/Comic_book_archive). + +## License + +The CBZ Library is released under the MIT License. See [LICENSE](LICENSE) for details. + +## Acknowledgments + +This library was developed with the needs of comic book fans and digital archivists in mind. We hope it helps you in managing and enjoying your comic book collections. \ No newline at end of file diff --git a/cbzProject/cbz/__init__.py b/cbzProject/cbz/__init__.py new file mode 100644 index 0000000..cd1ec14 --- /dev/null +++ b/cbzProject/cbz/__init__.py @@ -0,0 +1,5 @@ +from .comic import ComicInfo +from .constants import * +from .page import PageInfo + +__version__ = '3.2.0' diff --git a/cbzProject/cbz/comic.py b/cbzProject/cbz/comic.py new file mode 100644 index 0000000..5619aac --- /dev/null +++ b/cbzProject/cbz/comic.py @@ -0,0 +1,110 @@ +from __future__ import annotations + +import io +import json +import zipfile +from typing import Union + +import xmltodict +from langcodes import Language +from pathlib import Path + +from cbz import utils +from cbz.constants import YesNo, Manga, AgeRating, Format +from cbz.page import PageInfo + + +def rating(value: int) -> int: + assert -1 <= value <= 5, 'Rating must be between 0 and 5' + return value + + +def language(value: str) -> str: + if value and not Language.get(value).is_valid(): + raise ValueError('Invalid language') + return value + + +class ComicInfo: + + def __init__(self, pages: [PageInfo], **kwargs): + self.__pages = pages + self.__info = { + 'Title': str(kwargs.get('title', '')), + 'Series': str(kwargs.get('series', '')), + 'Number': str(kwargs.get('number', '')), + 'Count': int(kwargs.get('count', -1)), + 'Volume': int(kwargs.get('volume', -1)), + 'AlternateSeries': str(kwargs.get('alternate_series', '')), + 'AlternateNumber': str(kwargs.get('alternate_number', '')), + 'AlternateCount': int(kwargs.get('alternate_count', -1)), + 'Summary': str(kwargs.get('summary', '')), + 'Notes': str(kwargs.get('notes', '')), + 'Year': int(kwargs.get('year', -1)), + 'Month': int(kwargs.get('month', -1)), + 'Day': int(kwargs.get('day', -1)), + 'Writer': str(kwargs.get('writer', '')), + 'Penciller': str(kwargs.get('penciller', '')), + 'Inker': str(kwargs.get('inker', '')), + 'Colorist': str(kwargs.get('colorist', '')), + 'Letterer': str(kwargs.get('letterer', '')), + 'CoverArtist': str(kwargs.get('cover_artist', '')), + 'Editor': str(kwargs.get('editor', '')), + 'Translator': str(kwargs.get('translator', '')), + 'Publisher': str(kwargs.get('publisher', '')), + 'Imprint': str(kwargs.get('imprint', '')), + 'Genre': str(kwargs.get('genre', '')), + 'Tags': str(kwargs.get('tags', '')), + 'Web': str(kwargs.get('web', '')), + 'PageCount': len(self.__pages), + 'LanguageISO': language(kwargs.get('language_iso', '')), + 'Format': Format(kwargs.get('format', Format.UNKNOWN)), + 'EAN': str(kwargs.get('ean', '')), + 'BlackAndWhite': YesNo(kwargs.get('black_white', YesNo.UNKNOWN)), + 'Manga': Manga(kwargs.get('manga', Manga.UNKNOWN)), + 'Characters': str(kwargs.get('characters', '')), + 'Teams': str(kwargs.get('teams', '')), + 'Locations': str(kwargs.get('locations', '')), + 'ScanInformation': str(kwargs.get('scan_information', '')), + 'StoryArc': str(kwargs.get('story_arc', '')), + 'StoryArcNumber': str(kwargs.get('story_arc_number', '')), + 'SeriesGroup': str(kwargs.get('series_group', '')), + 'AgeRating': AgeRating(kwargs.get('age_rating', AgeRating.UNKNOWN)), + 'Pages': [{'Image': i, **page.dumps()} for i, page in enumerate(pages)], + 'CommunityRating': rating(kwargs.get('community_rating', -1)), + 'MainCharacterOrTeam': str(kwargs.get('main_character_or_team', '')), + 'Review': str(kwargs.get('review', '')) + } + + def dumps(self) -> dict: + return utils.dumps(self.__info) + + def __repr__(self) -> str: + return json.dumps(self.dumps(), indent=2) + + @classmethod + def from_pages(cls, pages: [PageInfo], **kwargs) -> ComicInfo: + return cls(pages, **kwargs) + + @classmethod + def from_cbz(cls, path: Union[Path, str]) -> ComicInfo: + if not isinstance(path, (Path, str)): + raise ValueError(f'Expecting Path object or path string, got {path!r}') + with Path(path).open(mode='rb') as f: + return cls(cls.__unpack(f.read())) + + def __unpack(self, data: bytes) -> tuple[[PageInfo], dict]: + raise NotImplemented + + def pack(self) -> bytes: + zip_buffer = io.BytesIO() + with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_STORED) as zip_file: + zip_file.writestr( + 'ComicInfo.xml', + xmltodict.unparse({'ComicInfo': self.dumps()}, pretty=True).encode('utf-8') + ) + + for i, page in enumerate(self.__pages): + zip_file.writestr(f'page-{i + 1:03d}{page.suffix}', page.content) + + return zip_buffer.getvalue() diff --git a/cbzProject/cbz/constants.py b/cbzProject/cbz/constants.py new file mode 100644 index 0000000..4060b13 --- /dev/null +++ b/cbzProject/cbz/constants.py @@ -0,0 +1,100 @@ +from enum import Enum + + +class YesNo(Enum): + UNKNOWN = 'Unknown' + NO = 'No' + YES = 'Yes' + + +class Manga(Enum): + UNKNOWN = 'Unknown' + NO = 'No' + YES = 'Yes' + RIGHT_LEFT = 'YesAndRightToLeft' + + +class PageType(Enum): + FRONT_COVER = 'FrontCover' + INNER_COVER = 'InnerCover' + ROUNDUP = 'Roundup' + STORY = 'Story' + ADVERTISEMENT = 'Advertisement' + EDITORIAL = 'Editorial' + LETTERS = 'Letters' + PREVIEW = 'Preview' + BACK_COVER = 'BackCover' + OTHER = 'Other' + DELETED = 'Deleted' + + +class AgeRating(Enum): + UNKNOWN = 'Unknown' + ADULTS18 = 'Adults Only 18+' + CHILDHOOD = 'Early Childhood' + EVERYONE = 'Everyone' + EVERYONE10 = 'Everyone 10+' + G = 'G' + KIDS = 'Kids to Adults' + M = 'M' + MA15 = 'MA15+' + MATURE17 = 'Mature 17+' + PG = 'PG' + R18 = 'R18+' + PENDING = 'Rating Pending' + TEEN = 'Teen' + X18 = 'X18+' + + +class Format(Enum): + UNKNOWN = 'Unknown' + # ONE_SHOT = '1 Shot' + # ONE_SHOT = '1/2', + # ONE_SHOT = '1-Shot' + ANNOTATION = 'Annotation' + # ANNOTATIONS = 'Annotations' + ANNUAL = 'Annual' + ANTHOLOGY = 'Anthology' + # BLACK_WHITE = 'B&W' + # BLACK_WHITE = 'B/W' + # BLACK_WHITE = 'B&&W' + BLACK_WHITE = 'Black & White' + # BOX_SET = 'Box Set' + BOX_SET = 'Box-Set' + CROSSOVER = 'Crossover' + DIRECTOR_CUT = 'Director\'s Cut' + EPILOGUE = 'Epilogue' + EVENT = 'Event' + FCBD = 'FCBD' + FLYER = 'Flyer' + # GIANT_SIZE = 'Giant' + # GIANT_SIZE = 'Giant Size' + GIANT_SIZE = 'Giant-Size' + GRAPHIC_NOVEL = 'Graphic Novel' + # HARDCOVER = 'Hardcover' + HARDCOVER = 'Hard-Cover' + # KING_SIZE = 'King' + # KING_SIZE = 'King Size' + KING_SIZE = 'King-Size' + LIMITED_SERIES = 'Limited Series' + MAGAZINE = 'Magazine' + NSFW = 'NSFW' + # ONE_SHOT = 'One Shot' + ONE_SHOT = 'One-Shot' + POINT1 = 'Point 1' + PREVIEW = 'Preview' + PROLOGUE = 'Prologue' + REFERENCE = 'Reference' + REVIEW = 'Review' + REVIEWED = 'Reviewed' + SCANLATION = 'Scanlation' + SCRIPT = 'Script' + SERIES = 'Series' + SKETCH = 'Sketch' + SPECIAL = 'Special' + # TRADE_PAPER_BACK = 'TPB' + TRADE_PAPER_BACK = 'Trade Paper Back' + # WEB_COMIC = 'WebComic' + WEB_COMIC = 'Web Comic' + # YEAR_ONE = 'Year 1' + YEAR_ONE = 'Year One' diff --git a/cbzProject/cbz/page.py b/cbzProject/cbz/page.py new file mode 100644 index 0000000..28bc870 --- /dev/null +++ b/cbzProject/cbz/page.py @@ -0,0 +1,53 @@ +from __future__ import annotations + +import base64 +import json +from io import BytesIO +from typing import Union + +from pathlib import Path + +from PIL import Image + +from cbz import utils +from cbz.constants import PageType + + +class PageInfo: + + def __init__(self, content: bytes, **kwargs): + image = Image.open(BytesIO(content)) + + self.suffix = f'.{image.format.lower()}' + self.content = content + self.__info = { + # 'Image': 0, + 'Type': PageType(kwargs.get('type', PageType.STORY)), + 'DoublePage': bool(kwargs.get('double', False)), + 'ImageSize': len(content), + 'Key': str(kwargs.get('key', '')), + 'Bookmark': str(kwargs.get('bookmark', '')), + 'ImageWidth': int(image.width), + 'ImageHeight': int(image.height) + } + + def dumps(self) -> dict: + return utils.dumps(self.__info) + + def __repr__(self) -> str: + return json.dumps(self.dumps(), indent=2) + + @classmethod + def loads(cls, data: Union[str, bytes], **kwargs) -> PageInfo: + if isinstance(data, str): + data = base64.b64decode(data) + if not isinstance(data, bytes): + raise ValueError(f'Expecting Bytes or Base64 input, got {data!r}') + return cls(data, **kwargs) + + @classmethod + def load(cls, path: Union[Path, str], **kwargs) -> PageInfo: + if not isinstance(path, (Path, str)): + raise ValueError(f'Expecting Path object or path string, got {path!r}') + with Path(path).open(mode='rb') as f: + return cls(f.read(), **kwargs) diff --git a/cbzProject/cbz/utils.py b/cbzProject/cbz/utils.py new file mode 100644 index 0000000..ee7dbcd --- /dev/null +++ b/cbzProject/cbz/utils.py @@ -0,0 +1,5 @@ +from enum import Enum + + +def dumps(data: dict) -> dict: + return {k: v.value if isinstance(v, Enum) else v for k, v in data.items() if v and v != -1 and v != 'Unknown'} diff --git a/docs/schema/v1.0/ComicInfo.xsd b/cbzProject/docs/schema/v1.0/ComicInfo.xsd similarity index 100% rename from docs/schema/v1.0/ComicInfo.xsd rename to cbzProject/docs/schema/v1.0/ComicInfo.xsd diff --git a/docs/schema/v2.0/ComicInfo.xsd b/cbzProject/docs/schema/v2.0/ComicInfo.xsd similarity index 100% rename from docs/schema/v2.0/ComicInfo.xsd rename to cbzProject/docs/schema/v2.0/ComicInfo.xsd diff --git a/docs/schema/v2.1/ComicInfo.xsd b/cbzProject/docs/schema/v2.1/ComicInfo.xsd similarity index 100% rename from docs/schema/v2.1/ComicInfo.xsd rename to cbzProject/docs/schema/v2.1/ComicInfo.xsd diff --git a/cbzProject/example/example.py b/cbzProject/example/example.py new file mode 100644 index 0000000..5f1a5da --- /dev/null +++ b/cbzProject/example/example.py @@ -0,0 +1,50 @@ +from pathlib import Path + +from cbz.comic import ComicInfo +from cbz.constants import PageType, YesNo, Manga, AgeRating, Format +from cbz.page import PageInfo + +PARENT = Path() + +if __name__ == '__main__': + # @Info: Load comic pages + paths = list((PARENT / 'images').iterdir()) + pages = [PageInfo.load( + path=path, + type=PageType.FRONT_COVER if i == 0 else PageType.BACK_COVER if i == len(paths) - 1 else PageType.STORY + ) for i, path in enumerate(paths)] + + # @Info: Load comic metadata + comic = ComicInfo.from_pages( + pages=pages, + title='T1 - Arrête de me chauffer, Nagatoro', + series='Arrête de me chauffer, Nagatoro', + number='1', + count=8, + volume=1, + summary='Nagatoro est en seconde. Pleine d\u2019assurance, joueuse, moqueuse, elle se d\u00e9couvre un jour un passe-temps favori : martyriser son \u201cSenpai\u201d, lyc\u00e9en de premi\u00e8re timide et mal dans sa peau. Nagatoro taquine, agace, aguiche, va parfois trop loin... mais qu\u2019a-t-elle vraiment derri\u00e8re la t\u00eate ? Et si derri\u00e8re ses moqueries elle cachait une v\u00e9ritable affection ? Et si finalement, ses farces permettaient \u00e0 Senpai de s\u2019affirmer ?', + year=2021, + month=3, + day=12, + writer='Nanashi', + inker='Nanashi', + editor='Noeve Grafx', + publisher='Noeve Grafx', + imprint='Noeve Grafx', + genre='Shonen', + web='http://www.izneo.com/en/manga/shonen/arrete-de-me-chauffer-nagatoro-37560/arrete-de-me-chauffer-nagatoro-86232', + language_iso='fr', + format=Format.PREVIEW, + black_white=YesNo.YES, + manga=Manga.RIGHT_LEFT, + age_rating=AgeRating.EVERYONE10, + community_rating=5, + ean='9782490676569' + ) + + # @Info: Pack cbz + cbz_content = comic.pack() + + # @Info: Write cbz + cbz_path = PARENT / 'Arrête de me chauffer, Nagatoro.cbz' + cbz_path.write_bytes(cbz_content) diff --git a/test/images/page-000.jpg b/cbzProject/example/images/page-000.jpg similarity index 100% rename from test/images/page-000.jpg rename to cbzProject/example/images/page-000.jpg diff --git a/test/images/page-001.jpg b/cbzProject/example/images/page-001.jpg similarity index 100% rename from test/images/page-001.jpg rename to cbzProject/example/images/page-001.jpg diff --git a/test/images/page-002.jpg b/cbzProject/example/images/page-002.jpg similarity index 100% rename from test/images/page-002.jpg rename to cbzProject/example/images/page-002.jpg diff --git a/test/images/page-003.jpg b/cbzProject/example/images/page-003.jpg similarity index 100% rename from test/images/page-003.jpg rename to cbzProject/example/images/page-003.jpg diff --git a/test/images/page-004.jpg b/cbzProject/example/images/page-004.jpg similarity index 100% rename from test/images/page-004.jpg rename to cbzProject/example/images/page-004.jpg diff --git a/test/images/page-005.jpg b/cbzProject/example/images/page-005.jpg similarity index 100% rename from test/images/page-005.jpg rename to cbzProject/example/images/page-005.jpg diff --git a/test/images/page-006.jpg b/cbzProject/example/images/page-006.jpg similarity index 100% rename from test/images/page-006.jpg rename to cbzProject/example/images/page-006.jpg diff --git a/test/images/page-007.jpg b/cbzProject/example/images/page-007.jpg similarity index 100% rename from test/images/page-007.jpg rename to cbzProject/example/images/page-007.jpg diff --git a/test/images/page-008.jpg b/cbzProject/example/images/page-008.jpg similarity index 100% rename from test/images/page-008.jpg rename to cbzProject/example/images/page-008.jpg diff --git a/test/images/page-009.jpg b/cbzProject/example/images/page-009.jpg similarity index 100% rename from test/images/page-009.jpg rename to cbzProject/example/images/page-009.jpg diff --git a/test/images/page-010.jpg b/cbzProject/example/images/page-010.jpg similarity index 100% rename from test/images/page-010.jpg rename to cbzProject/example/images/page-010.jpg diff --git a/cbzProject/setup.py b/cbzProject/setup.py new file mode 100644 index 0000000..f99d3a2 --- /dev/null +++ b/cbzProject/setup.py @@ -0,0 +1,42 @@ +from setuptools import setup, find_packages + +setup( + name='cbz', + version='3.2.0', + author='hyugogirubato', + author_email='hyugogirubato@gmail.com', + description='CBZ is a Python package designed to facilitate the creation, manipulation, and extraction of comic book archive files in the CBZ format.', + long_description=open('README.md').read(), + long_description_content_type='text/markdown', + url='https://github.com/hyugogirubato/cbz', + packages=find_packages(), + license='GPL-3.0-only', + keywords=[ + 'metadata', + 'manga', + 'comics', + 'ebooks', + 'cbz', + 'webtoons' + ], + classifiers=[ + 'Development Status :: 5 - Production/Stable', + 'Intended Audience :: Developers', + 'Intended Audience :: End Users/Desktop', + 'Natural Language :: English', + 'Operating System :: OS Independent', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'Topic :: Utilities' + ], + install_requires=[ + 'requests', + 'xmltodict', + 'langcodes', + 'Pillow' + ], + python_requires='>=3.7' +) diff --git a/hidive/__init__.py b/hidive/__init__.py new file mode 100644 index 0000000..b053191 --- /dev/null +++ b/hidive/__init__.py @@ -0,0 +1,5 @@ +from .client import * +from .constants import * +from .utils import * + +__version__ = '2.2.7' diff --git a/hidive/client.py b/hidive/client.py new file mode 100644 index 0000000..2c3a498 --- /dev/null +++ b/hidive/client.py @@ -0,0 +1,319 @@ +import time +from urllib.parse import urlencode +from uuid import UUID + +import requests +from requests import Response + +from hidive.constants import View, Filter +from hidive.utils import jwt_expired, b64encode + + +class Client: + USER_AGENT = 'ExoDoris/2.2.7 (Linux;Android 10) AndroidXMedia3/1.0.2' + + def __init__(self, access_token: str = None, refresh_token: str = None): + self.api = 'https://dce-frontoffice.imggaming.com/api' + self.guide = 'https://guide.imggaming.com' + self.algolia = 'https://h99xldr8mj-dsn.algolia.net' + self.user = { + 'authorisationToken': access_token or '', + 'refreshToken': refresh_token or '' + } + + def __request(self, **kwargs) -> Response: + headers = { + 'Accept': '*/*', + 'User-Agent': 'okhttp/4.9.2', + **kwargs.get('headers', {}) + } + + url: str = kwargs.get('url') + params = kwargs.get('params', {}) + + if url.startswith(self.api) or url.startswith(self.guide): + headers['app'] = 'dice' + headers['realm'] = 'dce.hidive' + headers['x-api-key'] = '4dc1e8df-5869-41ea-95c2-6f04c67459ed' + headers['x-app-var'] = '2.2.7' + + if kwargs.get('auth', True): + headers['Authorization'] = self.__token() + elif url.startswith(self.algolia): + params['x-algolia-agent'] = 'Algolia for JavaScript (3.35.1); React Native' + params['x-algolia-application-id'] = 'H99XLDR8MJ' + params['x-algolia-api-key'] = 'e55ccb3db0399eabe2bfc37a0314c346' + + r = requests.request( + method=kwargs.get('method', 'GET'), + url=url, + params=params, + json=kwargs.get('json'), + data=kwargs.get('data'), + headers=headers + ) + r.raise_for_status() + return r + + def __token(self) -> str: + access_token = self.user.get('authorisationToken') + if not access_token: + self.guest() + elif jwt_expired(access_token): + self.refresh() + return 'Bearer %s' % self.user['authorisationToken'] + + # @package: login + def guest(self) -> dict: + content = self.__request(method='POST', url=f'{self.api}/v2/login/guest/checkin', auth=False).json() + self.user.update(content) + return content + + def refresh(self) -> dict: + refresh_token = self.user['refreshToken'] + if jwt_expired(refresh_token): + raise ValueError('Refresh token expired') + + content = self.__request( + method='POST', + url=f'{self.api}/v2/token/refresh', + json={'refreshToken': refresh_token} + ).json() + self.user.update(content) + return content + + def login(self, email: str, password: str) -> dict: + content = self.__request( + method='POST', + url=f'{self.api}/v2/login', + json={'id': email, 'secret': password} + ).json() + self.user.update(content) + return content + + def reset(self, email: str) -> dict: + return self.__request( + method='POST', + url=f'{self.api}/v2/reset-password/create', + json={'id': email, 'provider': 'ID'}, + auth=False + ).json() + + def create(self, email: str, password: str) -> dict: + content = self.__request( + method='POST', + url=f'{self.api}/v2/user', + json={ + 'email': email, + 'secret': password, + 'consentAnswers': [{ + 'answer': f['required'], + 'promptField': f['fieldName'] + } for f in self.consent()['fields']] + } + ).json() + self.user.update(content) + return content + + # @package: realm + def providers(self) -> list[dict]: + return self.__request( + method='GET', + url=f'{self.api}/v2/realm/authentication-providers' + ).json()['authenticationProviders'] + + def settings(self) -> dict: + return self.__request(method='GET', url=f'{self.api}/v2/realm-settings/realm/dce.hidive').json() + + def label(self) -> dict: + return self.__request(method='GET', url=f'{self.api}/v2/label/dce.hidive').json() + + def licence(self) -> dict: + return self.__request(method='GET', url=f'{self.api}/v2/licence').json() + + def consent(self) -> dict: + return self.__request(method='GET', url=f'{self.api}/v2/consent-prompt').json() + + # @package: user + def preferences(self, auto_play: bool = None) -> dict: + method = 'GET' if auto_play is None else 'PUT' + data = None if auto_play is None else {'autoAdvance': auto_play} + return self.__request(method=method, url=f'{self.api}/v2/user/preferences', json=data).json() + + def profile(self) -> dict: + return self.__request(method='GET', url=f'{self.api}/v2/user/profile').json() + + def notification(self, limit: int = 1) -> dict: + return self.__request( + method='GET', + url=f'{self.api}/v2/promo-notification', + params={'maxNotifications': limit} + ).json() + + def watch_create(self, name: str) -> dict: + return self.__request( + method='POST', + url=f'{self.api}/v3/user/watchlist', + json={'name': name} + ).json() + + def watch_delete(self, watch_id: int) -> None: + href = b64encode('480211|dce.hidive') + self.__request(method='DELETE', url=f'{self.api}/v3/user/watchlist/{href}/{watch_id}') + + def watch(self, limit: int = 25) -> dict: + return self.__request(method='GET', url=f'{self.api}/v3/user/watchlist', params={'rpp': limit}).json() + + def watch_add(self, watch_id: int, content_type: str, content_id: int) -> dict: + return self.__request( + method='POST', + url=f'{self.api}/v4/user/watchlist/{watch_id}/content', + json={'content': [{'contentType': content_type, 'id': content_id}]} + ).json() + + def watch_remove(self, watch_id: int, content_type: str, content_id: int) -> None: + self.__request( + method='DELETE', + url=f'{self.api}/v4/user/watchlist/{watch_id}/content/{content_type}/{content_id}' + ) + + def watch_details(self, watch_id: int, limit: int = 25) -> dict: + return self.__request( + method='GET', + url=f'{self.api}/v4/user/watchlist/{watch_id}', + params={'rpp': limit} + ).json() + + # @package: content + def menu(self) -> list[dict]: + return self.__request(method='GET', url=f'{self.api}/v2/menu-items').json() + + def event(self, limit: int = 20) -> dict: + return self.__request(method='GET', url=f'{self.api}/v2/event/live', params={'rpp': limit}).json() + + def content(self, title: str = 'home') -> dict: + # @Default: home | browse + return self.__request( + method='GET', + url=f'{self.api}/v4/content/{title}', + params={ + 'bpp': 10, + 'rpp': 12, + 'displaySectionLinkBuckets': 'SHOW', + 'displayEpgBuckets': 'SHOW', + 'displayEmptyBucketShortcuts': 'SHOW', + 'displayGeoblocked': 'SHOW', + 'bspp': 20 + } + ).json() + + def popular(self) -> dict: + return self.__request(method='GET', url=f'{self.api}/v2/popular').json() + + def view(self, view: View, view_id: int) -> dict: + return self.__request( + method='GET', + url=f'{self.api}/v1/view', + params={'type': view.value, 'id': view_id} + ).json() + + def series(self, series_id: int, limit: int = 1) -> dict: + return self.__request(method='GET', url=f'{self.api}/v4/series/{series_id}', params={'rpp': limit}).json() + + def query( + self, + query: str, + facets: list = None, + facet_filters: list = None, + page: int = 0, + filters: Filter = None + ) -> dict: + params = { + 'facets': facets or [], + 'query': query, + 'facetFilters': facet_filters or [] + } + if filters: + params['filters'] = f'type:{filters.value}' + else: + params['page'] = page + + return self.__request( + method='POST', + url=f'{self.algolia}/1/indexes/prod-dce.hidive-livestreaming-events/query', + json={'params': urlencode(params)} + ).json() + + # @package: vod + def live(self, video_id: int) -> dict: + return self.__request(method='GET', url=f'{self.api}/v4/vods/live/{video_id}').json() + + def stream(self, video_id: int) -> dict: + return self.__request(method='GET', url=f'{self.api}/v3/stream/vod/{video_id}').json() + + def details(self, video_id: int, playback: bool = True) -> dict: + return self.__request( + method='GET', + url=f'{self.api}/v2/vod/{video_id}', + params={'includePlaybackDetails': 'URL'} if playback else None, + headers={ + 'cm-app-bundle': 'com.hidive.android', + 'cm-app-name': 'HIDIVE', + 'cm-app-storeid': 'com.hidive.android', + 'cm-app-version': '2.2.7', + 'cm-cst-ifa': '', + 'cm-cst-lat': '0', + 'cm-cst-tcf': '', + 'cm-cst-usp': '', + 'cm-dvc-dnt': '0', + 'cm-dvc-h': '720', + 'cm-dvc-lang': 'en_US', + 'cm-dvc-make': 'Xiaomi', + 'cm-dvc-model': 'Mi A2', + 'cm-dvc-os': '2', + 'cm-dvc-osv': '10', + 'cm-dvc-type': '4', + 'cm-dvc-w': '360' + } + ).json() + + def adjacent(self, video_id: int, limit: int = 20) -> dict: + return self.__request( + method='GET', + url=f'{self.api}/v4/vod/{video_id}/adjacent', + params={'size': limit} + ).json() + + # @package: player + def progress(self, video_id: int, cid: str, progress: int) -> dict: + return self.__request( + method='PUT', + url=f'{self.guide}/prod', + params={ + 'action': 2, + 'cid': cid, + 'nature': 'last', + 'progress': progress, + 'startedAt': round(time.time()), + 'video': video_id + } + ).json() + + def playback(self, url: str) -> dict: + return self.__request(method='GET', url=url, auth=False).json() + + def drm(self, url: str, token: str, key_ids: list[UUID], challenge: bytes) -> bytes: + # @Info: widevine DRM + return self.__request( + method='POST', + url=url, + data=challenge, + headers={ + 'Authorization': f'Bearer {token}', + 'User-Agent': 'Dice Shield/2.2.7 (Linux;Android 10) AndroidXMedia3/1.0.2', + 'X-DRM-INFO': b64encode({ + 'system': 'com.widevine.alpha', + 'key_ids': [str(k) for k in key_ids] + }) + } + ).content diff --git a/hidive/constants.py b/hidive/constants.py new file mode 100644 index 0000000..7603e4a --- /dev/null +++ b/hidive/constants.py @@ -0,0 +1,20 @@ +from enum import Enum + + +class Filter(Enum): + SERIES = 'VOD_SERIES' + VIDEO = 'VOD_VIDEO' + EVENT = 'LIVE_EVENT' + PLAYLIST = 'VOD_PLAYLIST' + + +class Format(Enum): + VTT = 'vtt' + SRT = 'srt' + SCC = 'scc' + + +class View(Enum): + SEASON = 'season' + PLAYLIST = 'playlist' + VOD = 'VOD' diff --git a/hidive/utils.py b/hidive/utils.py new file mode 100644 index 0000000..f92356c --- /dev/null +++ b/hidive/utils.py @@ -0,0 +1,31 @@ +import base64 +import json +import re +import time +from typing import Union + + +def b64decode(value: str) -> bytes: + return base64.b64decode(value + '=' * (4 - len(value) % 4)) + + +def b64encode(value: Union[str, bytes, dict, list]) -> str: + if isinstance(value, (dict, list)): + value = json.dumps(value, separators=(',', ':')) + if isinstance(value, str): + value = value.encode('utf-8') + return base64.b64encode(value).decode('utf-8') + + +def jwt_expired(value: str) -> bool: + header, payload, signature = value.split('.', 2) + payload = json.loads(b64decode(payload)) + return payload['exp'] < round(time.time()) + + +def parse_pssh(value: str) -> str: + lines = value.splitlines() + for i, line in enumerate(lines): + if 'urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed' in line: + return re.search(r'(.+)', lines[i + 1]).group(1) + raise ValueError('Could not find pssh') diff --git a/main.py b/main.py new file mode 100644 index 0000000..50a652a --- /dev/null +++ b/main.py @@ -0,0 +1,88 @@ +import requests +from pathlib import Path + +from hidive.client import Client +from hidive.constants import Format, View +from hidive.utils import parse_pssh, b64encode + +from pywidevine.cdm import Cdm +from pywidevine.device import Device +from pywidevine.pssh import PSSH + +DEVICE = Path() / 'DEVICE.wvd' + +if __name__ == '__main__': + client = Client() + client.login(email='EMAIL', password='PASSWORD') + + # @Info: series + series = client.series(series_id=1049) + print('[+] Series: %s' % series['title']) + print('[+] Cover: %s' % series['coverUrl']) + print('[+] Poster: %s' % series['posterUrl']) + + # @Info: seasons + for view in series['seasons']: + print('[+] Season: %s' % view['seasonNumber']) + season = client.view(view=View.SEASON, view_id=view['id']) + + # @Info: episodes + bucket = next(e for e in season['elements'] if e['$type'] == 'bucket') + for episode in bucket['attributes']['items']: + video_id = episode['id'] + print('[+] Title: %s' % episode['title']) + print('[+] Description: %s' % episode['description']) + + details = client.details(video_id=video_id, playback=True) + print('[+] Thumbnail: %s' % details['thumbnailUrl']) + + # @Info: subtitles + playback = client.playback(url=details['playerUrlCallback']) + dash = playback['dash'][0] + for subtitle in dash['subtitles']: + if subtitle['format'] == Format.VTT: + print('[+] Subtitle (%s): %s' % (subtitle['language'], subtitle['url'])) + + # @Info: widevine DRM + manifest_url = dash['url'] + print(f'[+] Manifest: {manifest_url}') + assert 'WIDEVINE' in dash['drm']['keySystems'], 'Unsupported DRM system' + + manifest = requests.request(method='GET', url=manifest_url, headers={'User-Agent': Client.USER_AGENT}).text + pssh = PSSH(parse_pssh(manifest)) + print(f'[+] PSSH: {pssh}') + + device = Device.load(DEVICE) + cdm = Cdm.from_device(device) + session_id = cdm.open() + + challenge = cdm.get_license_challenge(session_id, pssh) + print('[+] Challenge: %s' % b64encode(challenge)) + + licence = client.drm( + url=dash['drm']['url'], + token=dash['drm']['jwtToken'], + key_ids=pssh.key_ids, + challenge=challenge + ) + print(f'[+] Licence: {b64encode(licence)}') + + cdm.parse_license(session_id, licence) + keys = cdm.get_keys(session_id, type_='CONTENT') + if not keys: + raise ValueError('Could not find key') + + keys = [f'{k.kid.hex}:{k.key.hex()}' for k in keys] + cdm.close(session_id) + + print('[+] Keys: %s' % '|'.join(keys)) + + # @Info: download + print('[+] Prompt: %s' % ' '.join([ + 'N_m3u8DL-RE', + f'"{manifest_url}"', + *[f'--key "{k}"' for k in keys], + '--header', + f'"User-Agent: {Client.USER_AGENT}"' + ])) + exit(0) diff --git a/profiles/.idea/.gitignore b/profiles/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/profiles/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/profiles/.idea/inspectionProfiles/profiles_settings.xml b/profiles/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/profiles/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/profiles/.idea/misc.xml b/profiles/.idea/misc.xml new file mode 100644 index 0000000..9de2865 --- /dev/null +++ b/profiles/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/profiles/.idea/modules.xml b/profiles/.idea/modules.xml new file mode 100644 index 0000000..04c6e90 --- /dev/null +++ b/profiles/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/profiles/.idea/profiles.iml b/profiles/.idea/profiles.iml new file mode 100644 index 0000000..d0876a7 --- /dev/null +++ b/profiles/.idea/profiles.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/profiles/Avatar.zip b/profiles/Avatar.zip new file mode 100644 index 0000000..59079ca Binary files /dev/null and b/profiles/Avatar.zip differ diff --git a/profiles/Avatar/Attack on Titan/aot_fc_annie-avatar.png b/profiles/Avatar/Attack on Titan/aot_fc_annie-avatar.png new file mode 100644 index 0000000..1eabff6 Binary files /dev/null and b/profiles/Avatar/Attack on Titan/aot_fc_annie-avatar.png differ diff --git a/profiles/Avatar/Attack on Titan/aot_fc_armin-avatar.png b/profiles/Avatar/Attack on Titan/aot_fc_armin-avatar.png new file mode 100644 index 0000000..685fd1f Binary files /dev/null and b/profiles/Avatar/Attack on Titan/aot_fc_armin-avatar.png differ diff --git a/profiles/Avatar/Attack on Titan/aot_fc_conny-avatar.png b/profiles/Avatar/Attack on Titan/aot_fc_conny-avatar.png new file mode 100644 index 0000000..e15f8a3 Binary files /dev/null and b/profiles/Avatar/Attack on Titan/aot_fc_conny-avatar.png differ diff --git a/profiles/Avatar/Attack on Titan/aot_fc_eren-avatar.png b/profiles/Avatar/Attack on Titan/aot_fc_eren-avatar.png new file mode 100644 index 0000000..81394d8 Binary files /dev/null and b/profiles/Avatar/Attack on Titan/aot_fc_eren-avatar.png differ diff --git a/profiles/Avatar/Attack on Titan/aot_fc_hange-avatar.png b/profiles/Avatar/Attack on Titan/aot_fc_hange-avatar.png new file mode 100644 index 0000000..e0bd362 Binary files /dev/null and b/profiles/Avatar/Attack on Titan/aot_fc_hange-avatar.png differ diff --git a/profiles/Avatar/Attack on Titan/aot_fc_jean-avatar.png b/profiles/Avatar/Attack on Titan/aot_fc_jean-avatar.png new file mode 100644 index 0000000..ac99df9 Binary files /dev/null and b/profiles/Avatar/Attack on Titan/aot_fc_jean-avatar.png differ diff --git a/profiles/Avatar/Attack on Titan/aot_fc_levi-avatar.png b/profiles/Avatar/Attack on Titan/aot_fc_levi-avatar.png new file mode 100644 index 0000000..d04290c Binary files /dev/null and b/profiles/Avatar/Attack on Titan/aot_fc_levi-avatar.png differ diff --git a/profiles/Avatar/Attack on Titan/aot_fc_mikasa-avatar.png b/profiles/Avatar/Attack on Titan/aot_fc_mikasa-avatar.png new file mode 100644 index 0000000..61e50fd Binary files /dev/null and b/profiles/Avatar/Attack on Titan/aot_fc_mikasa-avatar.png differ diff --git a/profiles/Avatar/Attack on Titan/aot_fc_reiner-avatar.png b/profiles/Avatar/Attack on Titan/aot_fc_reiner-avatar.png new file mode 100644 index 0000000..c7caca8 Binary files /dev/null and b/profiles/Avatar/Attack on Titan/aot_fc_reiner-avatar.png differ diff --git a/profiles/Avatar/Attack on Titan/aot_fc_sasha-avatar.png b/profiles/Avatar/Attack on Titan/aot_fc_sasha-avatar.png new file mode 100644 index 0000000..d4fb015 Binary files /dev/null and b/profiles/Avatar/Attack on Titan/aot_fc_sasha-avatar.png differ diff --git a/profiles/Avatar/BOCCHI THE ROCK!/bocchi-avatar.png b/profiles/Avatar/BOCCHI THE ROCK!/bocchi-avatar.png new file mode 100644 index 0000000..da13b49 Binary files /dev/null and b/profiles/Avatar/BOCCHI THE ROCK!/bocchi-avatar.png differ diff --git a/profiles/Avatar/BOCCHI THE ROCK!/bocchi-iita-kv-avatar.png b/profiles/Avatar/BOCCHI THE ROCK!/bocchi-iita-kv-avatar.png new file mode 100644 index 0000000..18d11bf Binary files /dev/null and b/profiles/Avatar/BOCCHI THE ROCK!/bocchi-iita-kv-avatar.png differ diff --git a/profiles/Avatar/BOCCHI THE ROCK!/bocchi-kita-avatar.png b/profiles/Avatar/BOCCHI THE ROCK!/bocchi-kita-avatar.png new file mode 100644 index 0000000..c9d3cac Binary files /dev/null and b/profiles/Avatar/BOCCHI THE ROCK!/bocchi-kita-avatar.png differ diff --git a/profiles/Avatar/BOCCHI THE ROCK!/bocchi-kv-avatar.png b/profiles/Avatar/BOCCHI THE ROCK!/bocchi-kv-avatar.png new file mode 100644 index 0000000..6681e4f Binary files /dev/null and b/profiles/Avatar/BOCCHI THE ROCK!/bocchi-kv-avatar.png differ diff --git a/profiles/Avatar/BOCCHI THE ROCK!/bocchi-nijika-kv-avatar.png b/profiles/Avatar/BOCCHI THE ROCK!/bocchi-nijika-kv-avatar.png new file mode 100644 index 0000000..f6d65f2 Binary files /dev/null and b/profiles/Avatar/BOCCHI THE ROCK!/bocchi-nijika-kv-avatar.png differ diff --git a/profiles/Avatar/BOCCHI THE ROCK!/bocchi-ryo-avatar.png b/profiles/Avatar/BOCCHI THE ROCK!/bocchi-ryo-avatar.png new file mode 100644 index 0000000..164d86f Binary files /dev/null and b/profiles/Avatar/BOCCHI THE ROCK!/bocchi-ryo-avatar.png differ diff --git a/profiles/Avatar/BOCCHI THE ROCK!/bocchi-ryo-kv-avatar.png b/profiles/Avatar/BOCCHI THE ROCK!/bocchi-ryo-kv-avatar.png new file mode 100644 index 0000000..7d25b0f Binary files /dev/null and b/profiles/Avatar/BOCCHI THE ROCK!/bocchi-ryo-kv-avatar.png differ diff --git a/profiles/Avatar/BOCCHI THE ROCK!/bochhi-nijika-avatar.png b/profiles/Avatar/BOCCHI THE ROCK!/bochhi-nijika-avatar.png new file mode 100644 index 0000000..a0ec3d6 Binary files /dev/null and b/profiles/Avatar/BOCCHI THE ROCK!/bochhi-nijika-avatar.png differ diff --git a/profiles/Avatar/Bananya/21-bananya-bananya.png b/profiles/Avatar/Bananya/21-bananya-bananya.png new file mode 100644 index 0000000..bf87889 Binary files /dev/null and b/profiles/Avatar/Bananya/21-bananya-bananya.png differ diff --git a/profiles/Avatar/Bananya/22-bananya-droopy-eared.png b/profiles/Avatar/Bananya/22-bananya-droopy-eared.png new file mode 100644 index 0000000..b853d06 Binary files /dev/null and b/profiles/Avatar/Bananya/22-bananya-droopy-eared.png differ diff --git a/profiles/Avatar/Bananya/23-bananya-pirate.png b/profiles/Avatar/Bananya/23-bananya-pirate.png new file mode 100644 index 0000000..7a3c1e2 Binary files /dev/null and b/profiles/Avatar/Bananya/23-bananya-pirate.png differ diff --git a/profiles/Avatar/Bananya/24-bananya-night-rainbow.png b/profiles/Avatar/Bananya/24-bananya-night-rainbow.png new file mode 100644 index 0000000..be4a68f Binary files /dev/null and b/profiles/Avatar/Bananya/24-bananya-night-rainbow.png differ diff --git a/profiles/Avatar/Bananya/25-bananya-emo.png b/profiles/Avatar/Bananya/25-bananya-emo.png new file mode 100644 index 0000000..04b685b Binary files /dev/null and b/profiles/Avatar/Bananya/25-bananya-emo.png differ diff --git a/profiles/Avatar/Black Clover/1056-black-clover-asta.png b/profiles/Avatar/Black Clover/1056-black-clover-asta.png new file mode 100644 index 0000000..e470a28 Binary files /dev/null and b/profiles/Avatar/Black Clover/1056-black-clover-asta.png differ diff --git a/profiles/Avatar/Black Clover/1057-black-clover-yuno.png b/profiles/Avatar/Black Clover/1057-black-clover-yuno.png new file mode 100644 index 0000000..f86e621 Binary files /dev/null and b/profiles/Avatar/Black Clover/1057-black-clover-yuno.png differ diff --git a/profiles/Avatar/Black Clover/1058-black-clover-noelle.png b/profiles/Avatar/Black Clover/1058-black-clover-noelle.png new file mode 100644 index 0000000..c02d1ef Binary files /dev/null and b/profiles/Avatar/Black Clover/1058-black-clover-noelle.png differ diff --git a/profiles/Avatar/Black Clover/1059-black-clover-yami.png b/profiles/Avatar/Black Clover/1059-black-clover-yami.png new file mode 100644 index 0000000..08dac2e Binary files /dev/null and b/profiles/Avatar/Black Clover/1059-black-clover-yami.png differ diff --git a/profiles/Avatar/Black Clover/1060-black-clover-nero.png b/profiles/Avatar/Black Clover/1060-black-clover-nero.png new file mode 100644 index 0000000..4b70284 Binary files /dev/null and b/profiles/Avatar/Black Clover/1060-black-clover-nero.png differ diff --git a/profiles/Avatar/Chainsaw Man/chainsawman-aki.png b/profiles/Avatar/Chainsaw Man/chainsawman-aki.png new file mode 100644 index 0000000..f3a0c04 Binary files /dev/null and b/profiles/Avatar/Chainsaw Man/chainsawman-aki.png differ diff --git a/profiles/Avatar/Chainsaw Man/chainsawman-chainsawman.png b/profiles/Avatar/Chainsaw Man/chainsawman-chainsawman.png new file mode 100644 index 0000000..537c4db Binary files /dev/null and b/profiles/Avatar/Chainsaw Man/chainsawman-chainsawman.png differ diff --git a/profiles/Avatar/Chainsaw Man/chainsawman-denji.png b/profiles/Avatar/Chainsaw Man/chainsawman-denji.png new file mode 100644 index 0000000..be78698 Binary files /dev/null and b/profiles/Avatar/Chainsaw Man/chainsawman-denji.png differ diff --git a/profiles/Avatar/Chainsaw Man/chainsawman-himeno.png b/profiles/Avatar/Chainsaw Man/chainsawman-himeno.png new file mode 100644 index 0000000..0dc3246 Binary files /dev/null and b/profiles/Avatar/Chainsaw Man/chainsawman-himeno.png differ diff --git a/profiles/Avatar/Chainsaw Man/chainsawman-kishibe.png b/profiles/Avatar/Chainsaw Man/chainsawman-kishibe.png new file mode 100644 index 0000000..5ec9631 Binary files /dev/null and b/profiles/Avatar/Chainsaw Man/chainsawman-kishibe.png differ diff --git a/profiles/Avatar/Chainsaw Man/chainsawman-kobeni.png b/profiles/Avatar/Chainsaw Man/chainsawman-kobeni.png new file mode 100644 index 0000000..5f4080f Binary files /dev/null and b/profiles/Avatar/Chainsaw Man/chainsawman-kobeni.png differ diff --git a/profiles/Avatar/Chainsaw Man/chainsawman-makima.png b/profiles/Avatar/Chainsaw Man/chainsawman-makima.png new file mode 100644 index 0000000..97f2d82 Binary files /dev/null and b/profiles/Avatar/Chainsaw Man/chainsawman-makima.png differ diff --git a/profiles/Avatar/Chainsaw Man/chainsawman-pochita.png b/profiles/Avatar/Chainsaw Man/chainsawman-pochita.png new file mode 100644 index 0000000..882b33f Binary files /dev/null and b/profiles/Avatar/Chainsaw Man/chainsawman-pochita.png differ diff --git a/profiles/Avatar/Chainsaw Man/chainsawman-power.png b/profiles/Avatar/Chainsaw Man/chainsawman-power.png new file mode 100644 index 0000000..5c2bfda Binary files /dev/null and b/profiles/Avatar/Chainsaw Man/chainsawman-power.png differ diff --git a/profiles/Avatar/Crunchyroll/0001-cr-white-orange.png b/profiles/Avatar/Crunchyroll/0001-cr-white-orange.png new file mode 100644 index 0000000..8d8ae3c Binary files /dev/null and b/profiles/Avatar/Crunchyroll/0001-cr-white-orange.png differ diff --git a/profiles/Avatar/Crunchyroll/0002-cr-orange-white.png b/profiles/Avatar/Crunchyroll/0002-cr-orange-white.png new file mode 100644 index 0000000..450982d Binary files /dev/null and b/profiles/Avatar/Crunchyroll/0002-cr-orange-white.png differ diff --git a/profiles/Avatar/Crunchyroll/0003-cr-white-gradient1.png b/profiles/Avatar/Crunchyroll/0003-cr-white-gradient1.png new file mode 100644 index 0000000..ea33ec2 Binary files /dev/null and b/profiles/Avatar/Crunchyroll/0003-cr-white-gradient1.png differ diff --git a/profiles/Avatar/Crunchyroll/0004-cr-white-gradient2.png b/profiles/Avatar/Crunchyroll/0004-cr-white-gradient2.png new file mode 100644 index 0000000..473fb43 Binary files /dev/null and b/profiles/Avatar/Crunchyroll/0004-cr-white-gradient2.png differ diff --git a/profiles/Avatar/Crunchyroll/0005-cr-white-gradient3.png b/profiles/Avatar/Crunchyroll/0005-cr-white-gradient3.png new file mode 100644 index 0000000..4874e70 Binary files /dev/null and b/profiles/Avatar/Crunchyroll/0005-cr-white-gradient3.png differ diff --git a/profiles/Avatar/Crunchyroll/0006-cr-white-black.png b/profiles/Avatar/Crunchyroll/0006-cr-white-black.png new file mode 100644 index 0000000..7a2902e Binary files /dev/null and b/profiles/Avatar/Crunchyroll/0006-cr-white-black.png differ diff --git a/profiles/Avatar/Crunchyroll/0007-cr-orange-blue.png b/profiles/Avatar/Crunchyroll/0007-cr-orange-blue.png new file mode 100644 index 0000000..ceb5c9a Binary files /dev/null and b/profiles/Avatar/Crunchyroll/0007-cr-orange-blue.png differ diff --git a/profiles/Avatar/Crunchyroll/0008-cr-orange-black.png b/profiles/Avatar/Crunchyroll/0008-cr-orange-black.png new file mode 100644 index 0000000..bec30f2 Binary files /dev/null and b/profiles/Avatar/Crunchyroll/0008-cr-orange-black.png differ diff --git a/profiles/Avatar/Crunchyroll/0009-cr-rainbow-white.png b/profiles/Avatar/Crunchyroll/0009-cr-rainbow-white.png new file mode 100644 index 0000000..0db94a6 Binary files /dev/null and b/profiles/Avatar/Crunchyroll/0009-cr-rainbow-white.png differ diff --git a/profiles/Avatar/Crunchyroll/001-cr-hime-happy.png b/profiles/Avatar/Crunchyroll/001-cr-hime-happy.png new file mode 100644 index 0000000..e084f83 Binary files /dev/null and b/profiles/Avatar/Crunchyroll/001-cr-hime-happy.png differ diff --git a/profiles/Avatar/Crunchyroll/0010-cr-white-rainbow.png b/profiles/Avatar/Crunchyroll/0010-cr-white-rainbow.png new file mode 100644 index 0000000..499f06d Binary files /dev/null and b/profiles/Avatar/Crunchyroll/0010-cr-white-rainbow.png differ diff --git a/profiles/Avatar/Crunchyroll/002-cr-hime-annoyed.png b/profiles/Avatar/Crunchyroll/002-cr-hime-annoyed.png new file mode 100644 index 0000000..88f58ea Binary files /dev/null and b/profiles/Avatar/Crunchyroll/002-cr-hime-annoyed.png differ diff --git a/profiles/Avatar/Crunchyroll/003-cr-hime-excited.png b/profiles/Avatar/Crunchyroll/003-cr-hime-excited.png new file mode 100644 index 0000000..6d37469 Binary files /dev/null and b/profiles/Avatar/Crunchyroll/003-cr-hime-excited.png differ diff --git a/profiles/Avatar/Crunchyroll/004-cr-hime-mischievous.png b/profiles/Avatar/Crunchyroll/004-cr-hime-mischievous.png new file mode 100644 index 0000000..90d08ee Binary files /dev/null and b/profiles/Avatar/Crunchyroll/004-cr-hime-mischievous.png differ diff --git a/profiles/Avatar/Crunchyroll/005-cr-hime-sleepy.png b/profiles/Avatar/Crunchyroll/005-cr-hime-sleepy.png new file mode 100644 index 0000000..b0b5f36 Binary files /dev/null and b/profiles/Avatar/Crunchyroll/005-cr-hime-sleepy.png differ diff --git a/profiles/Avatar/Crunchyroll/006-cr-hime-sad.png b/profiles/Avatar/Crunchyroll/006-cr-hime-sad.png new file mode 100644 index 0000000..5b6fd28 Binary files /dev/null and b/profiles/Avatar/Crunchyroll/006-cr-hime-sad.png differ diff --git a/profiles/Avatar/Crunchyroll/007-cr-hime-relaxed.png b/profiles/Avatar/Crunchyroll/007-cr-hime-relaxed.png new file mode 100644 index 0000000..f06a663 Binary files /dev/null and b/profiles/Avatar/Crunchyroll/007-cr-hime-relaxed.png differ diff --git a/profiles/Avatar/Crunchyroll/008-cr-hime-angry.png b/profiles/Avatar/Crunchyroll/008-cr-hime-angry.png new file mode 100644 index 0000000..94e65db Binary files /dev/null and b/profiles/Avatar/Crunchyroll/008-cr-hime-angry.png differ diff --git a/profiles/Avatar/Crunchyroll/009-cr-hime-winking.png b/profiles/Avatar/Crunchyroll/009-cr-hime-winking.png new file mode 100644 index 0000000..ae44719 Binary files /dev/null and b/profiles/Avatar/Crunchyroll/009-cr-hime-winking.png differ diff --git a/profiles/Avatar/Crunchyroll/010-cr-hime-accomplished.png b/profiles/Avatar/Crunchyroll/010-cr-hime-accomplished.png new file mode 100644 index 0000000..f902f6a Binary files /dev/null and b/profiles/Avatar/Crunchyroll/010-cr-hime-accomplished.png differ diff --git a/profiles/Avatar/Dr. STONE/1046-dr-stone-senku.png b/profiles/Avatar/Dr. STONE/1046-dr-stone-senku.png new file mode 100644 index 0000000..1834789 Binary files /dev/null and b/profiles/Avatar/Dr. STONE/1046-dr-stone-senku.png differ diff --git a/profiles/Avatar/Dr. STONE/1047-dr-stone-suika.png b/profiles/Avatar/Dr. STONE/1047-dr-stone-suika.png new file mode 100644 index 0000000..d69d8e5 Binary files /dev/null and b/profiles/Avatar/Dr. STONE/1047-dr-stone-suika.png differ diff --git a/profiles/Avatar/Dr. STONE/1048-dr-stone-kohaku.png b/profiles/Avatar/Dr. STONE/1048-dr-stone-kohaku.png new file mode 100644 index 0000000..ee153ff Binary files /dev/null and b/profiles/Avatar/Dr. STONE/1048-dr-stone-kohaku.png differ diff --git a/profiles/Avatar/Dr. STONE/1049-dr-stone-chrome.png b/profiles/Avatar/Dr. STONE/1049-dr-stone-chrome.png new file mode 100644 index 0000000..7903acd Binary files /dev/null and b/profiles/Avatar/Dr. STONE/1049-dr-stone-chrome.png differ diff --git a/profiles/Avatar/Dr. STONE/1050-dr-stone-gen.png b/profiles/Avatar/Dr. STONE/1050-dr-stone-gen.png new file mode 100644 index 0000000..93e1417 Binary files /dev/null and b/profiles/Avatar/Dr. STONE/1050-dr-stone-gen.png differ diff --git a/profiles/Avatar/Fena_ Pirate Princess/1011-fena-pirate-princess-fena.png b/profiles/Avatar/Fena_ Pirate Princess/1011-fena-pirate-princess-fena.png new file mode 100644 index 0000000..6c78d38 Binary files /dev/null and b/profiles/Avatar/Fena_ Pirate Princess/1011-fena-pirate-princess-fena.png differ diff --git a/profiles/Avatar/Fena_ Pirate Princess/1012-fena-pirate-princess-yukimaru.png b/profiles/Avatar/Fena_ Pirate Princess/1012-fena-pirate-princess-yukimaru.png new file mode 100644 index 0000000..5edb235 Binary files /dev/null and b/profiles/Avatar/Fena_ Pirate Princess/1012-fena-pirate-princess-yukimaru.png differ diff --git a/profiles/Avatar/Fena_ Pirate Princess/1013-fena-pirate-princess-shitan.png b/profiles/Avatar/Fena_ Pirate Princess/1013-fena-pirate-princess-shitan.png new file mode 100644 index 0000000..1d23241 Binary files /dev/null and b/profiles/Avatar/Fena_ Pirate Princess/1013-fena-pirate-princess-shitan.png differ diff --git a/profiles/Avatar/Fena_ Pirate Princess/1014-fena-pirate-princess-karin.png b/profiles/Avatar/Fena_ Pirate Princess/1014-fena-pirate-princess-karin.png new file mode 100644 index 0000000..237a984 Binary files /dev/null and b/profiles/Avatar/Fena_ Pirate Princess/1014-fena-pirate-princess-karin.png differ diff --git a/profiles/Avatar/Fena_ Pirate Princess/1015-fena-pirate-princess-twins.png b/profiles/Avatar/Fena_ Pirate Princess/1015-fena-pirate-princess-twins.png new file mode 100644 index 0000000..348f07b Binary files /dev/null and b/profiles/Avatar/Fena_ Pirate Princess/1015-fena-pirate-princess-twins.png differ diff --git a/profiles/Avatar/Fena_ Pirate Princess/1016-fena-pirate-princess-makaba.png b/profiles/Avatar/Fena_ Pirate Princess/1016-fena-pirate-princess-makaba.png new file mode 100644 index 0000000..faec6a2 Binary files /dev/null and b/profiles/Avatar/Fena_ Pirate Princess/1016-fena-pirate-princess-makaba.png differ diff --git a/profiles/Avatar/Fena_ Pirate Princess/1017-fena-pirate-princess-tsubaki.png b/profiles/Avatar/Fena_ Pirate Princess/1017-fena-pirate-princess-tsubaki.png new file mode 100644 index 0000000..5615a53 Binary files /dev/null and b/profiles/Avatar/Fena_ Pirate Princess/1017-fena-pirate-princess-tsubaki.png differ diff --git a/profiles/Avatar/Fena_ Pirate Princess/1018-fena-pirate-princess-brule.png b/profiles/Avatar/Fena_ Pirate Princess/1018-fena-pirate-princess-brule.png new file mode 100644 index 0000000..b644c41 Binary files /dev/null and b/profiles/Avatar/Fena_ Pirate Princess/1018-fena-pirate-princess-brule.png differ diff --git a/profiles/Avatar/Fena_ Pirate Princess/1019-fena-pirate-princess-fena-young.png b/profiles/Avatar/Fena_ Pirate Princess/1019-fena-pirate-princess-fena-young.png new file mode 100644 index 0000000..55a3c74 Binary files /dev/null and b/profiles/Avatar/Fena_ Pirate Princess/1019-fena-pirate-princess-fena-young.png differ diff --git a/profiles/Avatar/Fena_ Pirate Princess/1020-fena-pirate-princess-yukimaru-young.png b/profiles/Avatar/Fena_ Pirate Princess/1020-fena-pirate-princess-yukimaru-young.png new file mode 100644 index 0000000..b48b4a0 Binary files /dev/null and b/profiles/Avatar/Fena_ Pirate Princess/1020-fena-pirate-princess-yukimaru-young.png differ diff --git a/profiles/Avatar/Frieren_ Beyond Journey's End/freiren-avatar-1.png b/profiles/Avatar/Frieren_ Beyond Journey's End/freiren-avatar-1.png new file mode 100644 index 0000000..192f99a Binary files /dev/null and b/profiles/Avatar/Frieren_ Beyond Journey's End/freiren-avatar-1.png differ diff --git a/profiles/Avatar/Frieren_ Beyond Journey's End/freiren-avatar-2.png b/profiles/Avatar/Frieren_ Beyond Journey's End/freiren-avatar-2.png new file mode 100644 index 0000000..88522f0 Binary files /dev/null and b/profiles/Avatar/Frieren_ Beyond Journey's End/freiren-avatar-2.png differ diff --git a/profiles/Avatar/Frieren_ Beyond Journey's End/freiren-avatar-3.png b/profiles/Avatar/Frieren_ Beyond Journey's End/freiren-avatar-3.png new file mode 100644 index 0000000..500b145 Binary files /dev/null and b/profiles/Avatar/Frieren_ Beyond Journey's End/freiren-avatar-3.png differ diff --git a/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_eisen-avatar-1.png b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_eisen-avatar-1.png new file mode 100644 index 0000000..e3f6d86 Binary files /dev/null and b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_eisen-avatar-1.png differ diff --git a/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_eisen-avatar-2.png b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_eisen-avatar-2.png new file mode 100644 index 0000000..63ae3f2 Binary files /dev/null and b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_eisen-avatar-2.png differ diff --git a/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_fern-avatar-1.png b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_fern-avatar-1.png new file mode 100644 index 0000000..15793fa Binary files /dev/null and b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_fern-avatar-1.png differ diff --git a/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_fern-avatar-2.png b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_fern-avatar-2.png new file mode 100644 index 0000000..fd39a4c Binary files /dev/null and b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_fern-avatar-2.png differ diff --git a/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_heiter-avatar-1.png b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_heiter-avatar-1.png new file mode 100644 index 0000000..c33611a Binary files /dev/null and b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_heiter-avatar-1.png differ diff --git a/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_heiter-avatar-2.png b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_heiter-avatar-2.png new file mode 100644 index 0000000..16d3f9e Binary files /dev/null and b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_heiter-avatar-2.png differ diff --git a/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_himmel-avatar-1.png b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_himmel-avatar-1.png new file mode 100644 index 0000000..2818347 Binary files /dev/null and b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_himmel-avatar-1.png differ diff --git a/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_himmel-avatar-2.png b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_himmel-avatar-2.png new file mode 100644 index 0000000..ae2c152 Binary files /dev/null and b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_himmel-avatar-2.png differ diff --git a/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_stark-avatar-1.png b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_stark-avatar-1.png new file mode 100644 index 0000000..9177b19 Binary files /dev/null and b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_stark-avatar-1.png differ diff --git a/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_stark-avatar-2.png b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_stark-avatar-2.png new file mode 100644 index 0000000..2895670 Binary files /dev/null and b/profiles/Avatar/Frieren_ Beyond Journey's End/frieren_stark-avatar-2.png differ diff --git a/profiles/Avatar/HIGH CARD/chris-1.png b/profiles/Avatar/HIGH CARD/chris-1.png new file mode 100644 index 0000000..c928b6b Binary files /dev/null and b/profiles/Avatar/HIGH CARD/chris-1.png differ diff --git a/profiles/Avatar/HIGH CARD/chris-2.png b/profiles/Avatar/HIGH CARD/chris-2.png new file mode 100644 index 0000000..c791417 Binary files /dev/null and b/profiles/Avatar/HIGH CARD/chris-2.png differ diff --git a/profiles/Avatar/HIGH CARD/finn-1.png b/profiles/Avatar/HIGH CARD/finn-1.png new file mode 100644 index 0000000..e6dc251 Binary files /dev/null and b/profiles/Avatar/HIGH CARD/finn-1.png differ diff --git a/profiles/Avatar/HIGH CARD/finn-2.png b/profiles/Avatar/HIGH CARD/finn-2.png new file mode 100644 index 0000000..09f4d80 Binary files /dev/null and b/profiles/Avatar/HIGH CARD/finn-2.png differ diff --git a/profiles/Avatar/HIGH CARD/leo-1.png b/profiles/Avatar/HIGH CARD/leo-1.png new file mode 100644 index 0000000..524ab6f Binary files /dev/null and b/profiles/Avatar/HIGH CARD/leo-1.png differ diff --git a/profiles/Avatar/HIGH CARD/leo-2.png b/profiles/Avatar/HIGH CARD/leo-2.png new file mode 100644 index 0000000..ecd938f Binary files /dev/null and b/profiles/Avatar/HIGH CARD/leo-2.png differ diff --git a/profiles/Avatar/HIGH CARD/vijay-1.png b/profiles/Avatar/HIGH CARD/vijay-1.png new file mode 100644 index 0000000..fb882f7 Binary files /dev/null and b/profiles/Avatar/HIGH CARD/vijay-1.png differ diff --git a/profiles/Avatar/HIGH CARD/vijay-2.png b/profiles/Avatar/HIGH CARD/vijay-2.png new file mode 100644 index 0000000..c247c14 Binary files /dev/null and b/profiles/Avatar/HIGH CARD/vijay-2.png differ diff --git a/profiles/Avatar/HIGH CARD/wendy-1.png b/profiles/Avatar/HIGH CARD/wendy-1.png new file mode 100644 index 0000000..1d1ff31 Binary files /dev/null and b/profiles/Avatar/HIGH CARD/wendy-1.png differ diff --git a/profiles/Avatar/HIGH CARD/wendy-2.png b/profiles/Avatar/HIGH CARD/wendy-2.png new file mode 100644 index 0000000..abfdec4 Binary files /dev/null and b/profiles/Avatar/HIGH CARD/wendy-2.png differ diff --git a/profiles/Avatar/I'm in Love with the Villainess/im_in_love_clarie-kv1.png b/profiles/Avatar/I'm in Love with the Villainess/im_in_love_clarie-kv1.png new file mode 100644 index 0000000..c035027 Binary files /dev/null and b/profiles/Avatar/I'm in Love with the Villainess/im_in_love_clarie-kv1.png differ diff --git a/profiles/Avatar/I'm in Love with the Villainess/im_in_love_clarie-kv2.png b/profiles/Avatar/I'm in Love with the Villainess/im_in_love_clarie-kv2.png new file mode 100644 index 0000000..28c2d19 Binary files /dev/null and b/profiles/Avatar/I'm in Love with the Villainess/im_in_love_clarie-kv2.png differ diff --git a/profiles/Avatar/I'm in Love with the Villainess/im_in_love_clarie.png b/profiles/Avatar/I'm in Love with the Villainess/im_in_love_clarie.png new file mode 100644 index 0000000..7b4dc6b Binary files /dev/null and b/profiles/Avatar/I'm in Love with the Villainess/im_in_love_clarie.png differ diff --git a/profiles/Avatar/I'm in Love with the Villainess/im_in_love_lene.png b/profiles/Avatar/I'm in Love with the Villainess/im_in_love_lene.png new file mode 100644 index 0000000..4a4c446 Binary files /dev/null and b/profiles/Avatar/I'm in Love with the Villainess/im_in_love_lene.png differ diff --git a/profiles/Avatar/I'm in Love with the Villainess/im_in_love_manaria.png b/profiles/Avatar/I'm in Love with the Villainess/im_in_love_manaria.png new file mode 100644 index 0000000..0036732 Binary files /dev/null and b/profiles/Avatar/I'm in Love with the Villainess/im_in_love_manaria.png differ diff --git a/profiles/Avatar/I'm in Love with the Villainess/im_in_love_misha.png b/profiles/Avatar/I'm in Love with the Villainess/im_in_love_misha.png new file mode 100644 index 0000000..41aa440 Binary files /dev/null and b/profiles/Avatar/I'm in Love with the Villainess/im_in_love_misha.png differ diff --git a/profiles/Avatar/I'm in Love with the Villainess/im_in_love_rae-kv1.png b/profiles/Avatar/I'm in Love with the Villainess/im_in_love_rae-kv1.png new file mode 100644 index 0000000..3adf463 Binary files /dev/null and b/profiles/Avatar/I'm in Love with the Villainess/im_in_love_rae-kv1.png differ diff --git a/profiles/Avatar/I'm in Love with the Villainess/im_in_love_rae-kv2.png b/profiles/Avatar/I'm in Love with the Villainess/im_in_love_rae-kv2.png new file mode 100644 index 0000000..f5639ea Binary files /dev/null and b/profiles/Avatar/I'm in Love with the Villainess/im_in_love_rae-kv2.png differ diff --git a/profiles/Avatar/I'm in Love with the Villainess/im_in_love_rae.png b/profiles/Avatar/I'm in Love with the Villainess/im_in_love_rae.png new file mode 100644 index 0000000..0babb96 Binary files /dev/null and b/profiles/Avatar/I'm in Love with the Villainess/im_in_love_rae.png differ diff --git a/profiles/Avatar/In_Spectre/26-inspectre-kotoko-iwanaga.png b/profiles/Avatar/In_Spectre/26-inspectre-kotoko-iwanaga.png new file mode 100644 index 0000000..7da3a08 Binary files /dev/null and b/profiles/Avatar/In_Spectre/26-inspectre-kotoko-iwanaga.png differ diff --git a/profiles/Avatar/In_Spectre/27-inspectre-kuro-sakuragawa.png b/profiles/Avatar/In_Spectre/27-inspectre-kuro-sakuragawa.png new file mode 100644 index 0000000..41c5584 Binary files /dev/null and b/profiles/Avatar/In_Spectre/27-inspectre-kuro-sakuragawa.png differ diff --git a/profiles/Avatar/In_Spectre/28-inspectre-saki-yumihara.png b/profiles/Avatar/In_Spectre/28-inspectre-saki-yumihara.png new file mode 100644 index 0000000..8d3e3b1 Binary files /dev/null and b/profiles/Avatar/In_Spectre/28-inspectre-saki-yumihara.png differ diff --git a/profiles/Avatar/In_Spectre/29-inspectre-steel-lady-nanase.png b/profiles/Avatar/In_Spectre/29-inspectre-steel-lady-nanase.png new file mode 100644 index 0000000..d5bd005 Binary files /dev/null and b/profiles/Avatar/In_Spectre/29-inspectre-steel-lady-nanase.png differ diff --git a/profiles/Avatar/In_Spectre/30-inspectre-komainu.png b/profiles/Avatar/In_Spectre/30-inspectre-komainu.png new file mode 100644 index 0000000..18c3012 Binary files /dev/null and b/profiles/Avatar/In_Spectre/30-inspectre-komainu.png differ diff --git a/profiles/Avatar/JUJUTSU KAISEN/1041-jujutsu-kaisen-yuji-itadori.png b/profiles/Avatar/JUJUTSU KAISEN/1041-jujutsu-kaisen-yuji-itadori.png new file mode 100644 index 0000000..13b338f Binary files /dev/null and b/profiles/Avatar/JUJUTSU KAISEN/1041-jujutsu-kaisen-yuji-itadori.png differ diff --git a/profiles/Avatar/JUJUTSU KAISEN/1042-jujutsu-kaisen-megumi-fushigoro.png b/profiles/Avatar/JUJUTSU KAISEN/1042-jujutsu-kaisen-megumi-fushigoro.png new file mode 100644 index 0000000..62b3c03 Binary files /dev/null and b/profiles/Avatar/JUJUTSU KAISEN/1042-jujutsu-kaisen-megumi-fushigoro.png differ diff --git a/profiles/Avatar/JUJUTSU KAISEN/1043-jujutsu-kaisen-nobara-kugisaki.png b/profiles/Avatar/JUJUTSU KAISEN/1043-jujutsu-kaisen-nobara-kugisaki.png new file mode 100644 index 0000000..f69ddde Binary files /dev/null and b/profiles/Avatar/JUJUTSU KAISEN/1043-jujutsu-kaisen-nobara-kugisaki.png differ diff --git a/profiles/Avatar/JUJUTSU KAISEN/1044-jujutsu-kaisen-satoru-gojo.png b/profiles/Avatar/JUJUTSU KAISEN/1044-jujutsu-kaisen-satoru-gojo.png new file mode 100644 index 0000000..ac082bf Binary files /dev/null and b/profiles/Avatar/JUJUTSU KAISEN/1044-jujutsu-kaisen-satoru-gojo.png differ diff --git a/profiles/Avatar/JUJUTSU KAISEN/1045-jujutsu-kaisen-ryomen-sukuna.png b/profiles/Avatar/JUJUTSU KAISEN/1045-jujutsu-kaisen-ryomen-sukuna.png new file mode 100644 index 0000000..5bdfbbb Binary files /dev/null and b/profiles/Avatar/JUJUTSU KAISEN/1045-jujutsu-kaisen-ryomen-sukuna.png differ diff --git a/profiles/Avatar/Metallic Rouge/afdal.png b/profiles/Avatar/Metallic Rouge/afdal.png new file mode 100644 index 0000000..5b658a3 Binary files /dev/null and b/profiles/Avatar/Metallic Rouge/afdal.png differ diff --git a/profiles/Avatar/Metallic Rouge/ash.png b/profiles/Avatar/Metallic Rouge/ash.png new file mode 100644 index 0000000..e093459 Binary files /dev/null and b/profiles/Avatar/Metallic Rouge/ash.png differ diff --git a/profiles/Avatar/Metallic Rouge/eden.png b/profiles/Avatar/Metallic Rouge/eden.png new file mode 100644 index 0000000..3038e6a Binary files /dev/null and b/profiles/Avatar/Metallic Rouge/eden.png differ diff --git a/profiles/Avatar/Metallic Rouge/gene-1.png b/profiles/Avatar/Metallic Rouge/gene-1.png new file mode 100644 index 0000000..318f539 Binary files /dev/null and b/profiles/Avatar/Metallic Rouge/gene-1.png differ diff --git a/profiles/Avatar/Metallic Rouge/gene-2.png b/profiles/Avatar/Metallic Rouge/gene-2.png new file mode 100644 index 0000000..785137f Binary files /dev/null and b/profiles/Avatar/Metallic Rouge/gene-2.png differ diff --git a/profiles/Avatar/Metallic Rouge/giallon-1.png b/profiles/Avatar/Metallic Rouge/giallon-1.png new file mode 100644 index 0000000..0295271 Binary files /dev/null and b/profiles/Avatar/Metallic Rouge/giallon-1.png differ diff --git a/profiles/Avatar/Metallic Rouge/giallon-2.png b/profiles/Avatar/Metallic Rouge/giallon-2.png new file mode 100644 index 0000000..5ade5b9 Binary files /dev/null and b/profiles/Avatar/Metallic Rouge/giallon-2.png differ diff --git a/profiles/Avatar/Metallic Rouge/jill.png b/profiles/Avatar/Metallic Rouge/jill.png new file mode 100644 index 0000000..31e0de2 Binary files /dev/null and b/profiles/Avatar/Metallic Rouge/jill.png differ diff --git a/profiles/Avatar/Metallic Rouge/naomi-1.png b/profiles/Avatar/Metallic Rouge/naomi-1.png new file mode 100644 index 0000000..f4ed375 Binary files /dev/null and b/profiles/Avatar/Metallic Rouge/naomi-1.png differ diff --git a/profiles/Avatar/Metallic Rouge/naomi-2.png b/profiles/Avatar/Metallic Rouge/naomi-2.png new file mode 100644 index 0000000..4dcc8f6 Binary files /dev/null and b/profiles/Avatar/Metallic Rouge/naomi-2.png differ diff --git a/profiles/Avatar/Metallic Rouge/noid.png b/profiles/Avatar/Metallic Rouge/noid.png new file mode 100644 index 0000000..6088bec Binary files /dev/null and b/profiles/Avatar/Metallic Rouge/noid.png differ diff --git a/profiles/Avatar/Metallic Rouge/rouge-1.png b/profiles/Avatar/Metallic Rouge/rouge-1.png new file mode 100644 index 0000000..979f87f Binary files /dev/null and b/profiles/Avatar/Metallic Rouge/rouge-1.png differ diff --git a/profiles/Avatar/Metallic Rouge/rouge-2.png b/profiles/Avatar/Metallic Rouge/rouge-2.png new file mode 100644 index 0000000..46b1e05 Binary files /dev/null and b/profiles/Avatar/Metallic Rouge/rouge-2.png differ diff --git a/profiles/Avatar/Metallic Rouge/rouge-3.png b/profiles/Avatar/Metallic Rouge/rouge-3.png new file mode 100644 index 0000000..d8f87ce Binary files /dev/null and b/profiles/Avatar/Metallic Rouge/rouge-3.png differ diff --git a/profiles/Avatar/Metallic Rouge/rouge-4.png b/profiles/Avatar/Metallic Rouge/rouge-4.png new file mode 100644 index 0000000..55391d0 Binary files /dev/null and b/profiles/Avatar/Metallic Rouge/rouge-4.png differ diff --git a/profiles/Avatar/Metallic Rouge/sarah.png b/profiles/Avatar/Metallic Rouge/sarah.png new file mode 100644 index 0000000..d98ca92 Binary files /dev/null and b/profiles/Avatar/Metallic Rouge/sarah.png differ diff --git a/profiles/Avatar/Mitrasphere/1006-mitrasphere-hime.png b/profiles/Avatar/Mitrasphere/1006-mitrasphere-hime.png new file mode 100644 index 0000000..d9a5285 Binary files /dev/null and b/profiles/Avatar/Mitrasphere/1006-mitrasphere-hime.png differ diff --git a/profiles/Avatar/Mitrasphere/1007-mitrasphere-yuzu.png b/profiles/Avatar/Mitrasphere/1007-mitrasphere-yuzu.png new file mode 100644 index 0000000..7f720b7 Binary files /dev/null and b/profiles/Avatar/Mitrasphere/1007-mitrasphere-yuzu.png differ diff --git a/profiles/Avatar/Mitrasphere/1008-mitrasphere-matilda.png b/profiles/Avatar/Mitrasphere/1008-mitrasphere-matilda.png new file mode 100644 index 0000000..005c936 Binary files /dev/null and b/profiles/Avatar/Mitrasphere/1008-mitrasphere-matilda.png differ diff --git a/profiles/Avatar/Mitrasphere/1009-mitrasphere-hildegard.png b/profiles/Avatar/Mitrasphere/1009-mitrasphere-hildegard.png new file mode 100644 index 0000000..5095288 Binary files /dev/null and b/profiles/Avatar/Mitrasphere/1009-mitrasphere-hildegard.png differ diff --git a/profiles/Avatar/Mitrasphere/1010-mitrasphere-upa.png b/profiles/Avatar/Mitrasphere/1010-mitrasphere-upa.png new file mode 100644 index 0000000..a8b61d7 Binary files /dev/null and b/profiles/Avatar/Mitrasphere/1010-mitrasphere-upa.png differ diff --git a/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_ariel.png b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_ariel.png new file mode 100644 index 0000000..322fe82 Binary files /dev/null and b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_ariel.png differ diff --git a/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_cliff.png b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_cliff.png new file mode 100644 index 0000000..55a2174 Binary files /dev/null and b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_cliff.png differ diff --git a/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_elinalise.png b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_elinalise.png new file mode 100644 index 0000000..d376ca7 Binary files /dev/null and b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_elinalise.png differ diff --git a/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_eris.png b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_eris.png new file mode 100644 index 0000000..5fd84e6 Binary files /dev/null and b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_eris.png differ diff --git a/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_ghislaine.png b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_ghislaine.png new file mode 100644 index 0000000..11e7bdc Binary files /dev/null and b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_ghislaine.png differ diff --git a/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_juli.png b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_juli.png new file mode 100644 index 0000000..7c13e9e Binary files /dev/null and b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_juli.png differ diff --git a/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_linia.png b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_linia.png new file mode 100644 index 0000000..aa1461f Binary files /dev/null and b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_linia.png differ diff --git a/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_luke.png b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_luke.png new file mode 100644 index 0000000..8200f90 Binary files /dev/null and b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_luke.png differ diff --git a/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_pursena.png b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_pursena.png new file mode 100644 index 0000000..1a779e9 Binary files /dev/null and b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_pursena.png differ diff --git a/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_rudeus-school-uniform.png b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_rudeus-school-uniform.png new file mode 100644 index 0000000..9499837 Binary files /dev/null and b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_rudeus-school-uniform.png differ diff --git a/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_rudeus.png b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_rudeus.png new file mode 100644 index 0000000..8f22a41 Binary files /dev/null and b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_rudeus.png differ diff --git a/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_ruijerd.png b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_ruijerd.png new file mode 100644 index 0000000..9dd5ce6 Binary files /dev/null and b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_ruijerd.png differ diff --git a/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_sara.png b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_sara.png new file mode 100644 index 0000000..7bf433c Binary files /dev/null and b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_sara.png differ diff --git a/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_soldat.png b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_soldat.png new file mode 100644 index 0000000..e38cb2f Binary files /dev/null and b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_soldat.png differ diff --git a/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_suzanne.png b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_suzanne.png new file mode 100644 index 0000000..d5d7999 Binary files /dev/null and b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_suzanne.png differ diff --git a/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_sylphie-fitz.png b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_sylphie-fitz.png new file mode 100644 index 0000000..aac3099 Binary files /dev/null and b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_sylphie-fitz.png differ diff --git a/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_sylphie.png b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_sylphie.png new file mode 100644 index 0000000..4d72823 Binary files /dev/null and b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_sylphie.png differ diff --git a/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_zanoba.png b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_zanoba.png new file mode 100644 index 0000000..42e3297 Binary files /dev/null and b/profiles/Avatar/Mushoku Tensei_ Jobless Reincarnation/mushokutensei_zanoba.png differ diff --git a/profiles/Avatar/My Dress-Up Darling/my-dress-up-gojo-1-avatar.png b/profiles/Avatar/My Dress-Up Darling/my-dress-up-gojo-1-avatar.png new file mode 100644 index 0000000..d0d330c Binary files /dev/null and b/profiles/Avatar/My Dress-Up Darling/my-dress-up-gojo-1-avatar.png differ diff --git a/profiles/Avatar/My Dress-Up Darling/my-dress-up-gojo-2-avatar.png b/profiles/Avatar/My Dress-Up Darling/my-dress-up-gojo-2-avatar.png new file mode 100644 index 0000000..248efe7 Binary files /dev/null and b/profiles/Avatar/My Dress-Up Darling/my-dress-up-gojo-2-avatar.png differ diff --git a/profiles/Avatar/My Dress-Up Darling/my-dress-up-marin-1-avatar.png b/profiles/Avatar/My Dress-Up Darling/my-dress-up-marin-1-avatar.png new file mode 100644 index 0000000..5b906d8 Binary files /dev/null and b/profiles/Avatar/My Dress-Up Darling/my-dress-up-marin-1-avatar.png differ diff --git a/profiles/Avatar/My Dress-Up Darling/my-dress-up-marin-2-avatar.png b/profiles/Avatar/My Dress-Up Darling/my-dress-up-marin-2-avatar.png new file mode 100644 index 0000000..95a33cb Binary files /dev/null and b/profiles/Avatar/My Dress-Up Darling/my-dress-up-marin-2-avatar.png differ diff --git a/profiles/Avatar/My Dress-Up Darling/my-dress-up-marin-cosplay-avatar.png b/profiles/Avatar/My Dress-Up Darling/my-dress-up-marin-cosplay-avatar.png new file mode 100644 index 0000000..a3fe5ca Binary files /dev/null and b/profiles/Avatar/My Dress-Up Darling/my-dress-up-marin-cosplay-avatar.png differ diff --git a/profiles/Avatar/My Dress-Up Darling/my-dress-up-marin-normal-avatar.png b/profiles/Avatar/My Dress-Up Darling/my-dress-up-marin-normal-avatar.png new file mode 100644 index 0000000..a55b324 Binary files /dev/null and b/profiles/Avatar/My Dress-Up Darling/my-dress-up-marin-normal-avatar.png differ diff --git a/profiles/Avatar/My Dress-Up Darling/my-dress-up-sajuna-1-avatar.png b/profiles/Avatar/My Dress-Up Darling/my-dress-up-sajuna-1-avatar.png new file mode 100644 index 0000000..41d5493 Binary files /dev/null and b/profiles/Avatar/My Dress-Up Darling/my-dress-up-sajuna-1-avatar.png differ diff --git a/profiles/Avatar/My Dress-Up Darling/my-dress-up-sajuna-2-avatar.png b/profiles/Avatar/My Dress-Up Darling/my-dress-up-sajuna-2-avatar.png new file mode 100644 index 0000000..b309816 Binary files /dev/null and b/profiles/Avatar/My Dress-Up Darling/my-dress-up-sajuna-2-avatar.png differ diff --git a/profiles/Avatar/My Dress-Up Darling/my-dress-up-shinju-1-avatar.png b/profiles/Avatar/My Dress-Up Darling/my-dress-up-shinju-1-avatar.png new file mode 100644 index 0000000..684e69d Binary files /dev/null and b/profiles/Avatar/My Dress-Up Darling/my-dress-up-shinju-1-avatar.png differ diff --git a/profiles/Avatar/My Dress-Up Darling/my-dress-up-shinju-2-avatar.png b/profiles/Avatar/My Dress-Up Darling/my-dress-up-shinju-2-avatar.png new file mode 100644 index 0000000..8d13aec Binary files /dev/null and b/profiles/Avatar/My Dress-Up Darling/my-dress-up-shinju-2-avatar.png differ diff --git a/profiles/Avatar/One Piece/avatars-big_mom.png b/profiles/Avatar/One Piece/avatars-big_mom.png new file mode 100644 index 0000000..864469b Binary files /dev/null and b/profiles/Avatar/One Piece/avatars-big_mom.png differ diff --git a/profiles/Avatar/One Piece/avatars-brook.png b/profiles/Avatar/One Piece/avatars-brook.png new file mode 100644 index 0000000..3bb7694 Binary files /dev/null and b/profiles/Avatar/One Piece/avatars-brook.png differ diff --git a/profiles/Avatar/One Piece/avatars-chopper.png b/profiles/Avatar/One Piece/avatars-chopper.png new file mode 100644 index 0000000..50a793a Binary files /dev/null and b/profiles/Avatar/One Piece/avatars-chopper.png differ diff --git a/profiles/Avatar/One Piece/avatars-franky.png b/profiles/Avatar/One Piece/avatars-franky.png new file mode 100644 index 0000000..14be1d7 Binary files /dev/null and b/profiles/Avatar/One Piece/avatars-franky.png differ diff --git a/profiles/Avatar/One Piece/avatars-jinbei.png b/profiles/Avatar/One Piece/avatars-jinbei.png new file mode 100644 index 0000000..b90fc6d Binary files /dev/null and b/profiles/Avatar/One Piece/avatars-jinbei.png differ diff --git a/profiles/Avatar/One Piece/avatars-kaido.png b/profiles/Avatar/One Piece/avatars-kaido.png new file mode 100644 index 0000000..3822618 Binary files /dev/null and b/profiles/Avatar/One Piece/avatars-kaido.png differ diff --git a/profiles/Avatar/One Piece/avatars-kid.png b/profiles/Avatar/One Piece/avatars-kid.png new file mode 100644 index 0000000..67a840d Binary files /dev/null and b/profiles/Avatar/One Piece/avatars-kid.png differ diff --git a/profiles/Avatar/One Piece/avatars-law.png b/profiles/Avatar/One Piece/avatars-law.png new file mode 100644 index 0000000..7dca180 Binary files /dev/null and b/profiles/Avatar/One Piece/avatars-law.png differ diff --git a/profiles/Avatar/One Piece/avatars-luffy.png b/profiles/Avatar/One Piece/avatars-luffy.png new file mode 100644 index 0000000..24aa061 Binary files /dev/null and b/profiles/Avatar/One Piece/avatars-luffy.png differ diff --git a/profiles/Avatar/One Piece/avatars-nami.png b/profiles/Avatar/One Piece/avatars-nami.png new file mode 100644 index 0000000..a600224 Binary files /dev/null and b/profiles/Avatar/One Piece/avatars-nami.png differ diff --git a/profiles/Avatar/One Piece/avatars-perona.png b/profiles/Avatar/One Piece/avatars-perona.png new file mode 100644 index 0000000..474a101 Binary files /dev/null and b/profiles/Avatar/One Piece/avatars-perona.png differ diff --git a/profiles/Avatar/One Piece/avatars-robin.png b/profiles/Avatar/One Piece/avatars-robin.png new file mode 100644 index 0000000..684e88b Binary files /dev/null and b/profiles/Avatar/One Piece/avatars-robin.png differ diff --git a/profiles/Avatar/One Piece/avatars-sanji.png b/profiles/Avatar/One Piece/avatars-sanji.png new file mode 100644 index 0000000..4783833 Binary files /dev/null and b/profiles/Avatar/One Piece/avatars-sanji.png differ diff --git a/profiles/Avatar/One Piece/avatars-shanks.png b/profiles/Avatar/One Piece/avatars-shanks.png new file mode 100644 index 0000000..5aa8cb6 Binary files /dev/null and b/profiles/Avatar/One Piece/avatars-shanks.png differ diff --git a/profiles/Avatar/One Piece/avatars-usopp.png b/profiles/Avatar/One Piece/avatars-usopp.png new file mode 100644 index 0000000..302fdcf Binary files /dev/null and b/profiles/Avatar/One Piece/avatars-usopp.png differ diff --git a/profiles/Avatar/One Piece/avatars-yamato.png b/profiles/Avatar/One Piece/avatars-yamato.png new file mode 100644 index 0000000..b1bc330 Binary files /dev/null and b/profiles/Avatar/One Piece/avatars-yamato.png differ diff --git a/profiles/Avatar/One Piece/avatars-zoro.png b/profiles/Avatar/One Piece/avatars-zoro.png new file mode 100644 index 0000000..d38c468 Binary files /dev/null and b/profiles/Avatar/One Piece/avatars-zoro.png differ diff --git a/profiles/Avatar/One Piece/egghead-brook.png b/profiles/Avatar/One Piece/egghead-brook.png new file mode 100644 index 0000000..1a32033 Binary files /dev/null and b/profiles/Avatar/One Piece/egghead-brook.png differ diff --git a/profiles/Avatar/One Piece/egghead-chopper.png b/profiles/Avatar/One Piece/egghead-chopper.png new file mode 100644 index 0000000..4d84d37 Binary files /dev/null and b/profiles/Avatar/One Piece/egghead-chopper.png differ diff --git a/profiles/Avatar/One Piece/egghead-franky.png b/profiles/Avatar/One Piece/egghead-franky.png new file mode 100644 index 0000000..c2ece29 Binary files /dev/null and b/profiles/Avatar/One Piece/egghead-franky.png differ diff --git a/profiles/Avatar/One Piece/egghead-jimbei.png b/profiles/Avatar/One Piece/egghead-jimbei.png new file mode 100644 index 0000000..d7e08ca Binary files /dev/null and b/profiles/Avatar/One Piece/egghead-jimbei.png differ diff --git a/profiles/Avatar/One Piece/egghead-luffy.png b/profiles/Avatar/One Piece/egghead-luffy.png new file mode 100644 index 0000000..9b8f569 Binary files /dev/null and b/profiles/Avatar/One Piece/egghead-luffy.png differ diff --git a/profiles/Avatar/One Piece/egghead-nami.png b/profiles/Avatar/One Piece/egghead-nami.png new file mode 100644 index 0000000..a3efc2b Binary files /dev/null and b/profiles/Avatar/One Piece/egghead-nami.png differ diff --git a/profiles/Avatar/One Piece/egghead-robin.png b/profiles/Avatar/One Piece/egghead-robin.png new file mode 100644 index 0000000..9a52abc Binary files /dev/null and b/profiles/Avatar/One Piece/egghead-robin.png differ diff --git a/profiles/Avatar/One Piece/egghead-sanji.png b/profiles/Avatar/One Piece/egghead-sanji.png new file mode 100644 index 0000000..63d48d1 Binary files /dev/null and b/profiles/Avatar/One Piece/egghead-sanji.png differ diff --git a/profiles/Avatar/One Piece/egghead-usopp.png b/profiles/Avatar/One Piece/egghead-usopp.png new file mode 100644 index 0000000..9ecb8ac Binary files /dev/null and b/profiles/Avatar/One Piece/egghead-usopp.png differ diff --git a/profiles/Avatar/One Piece/egghead-zoro.png b/profiles/Avatar/One Piece/egghead-zoro.png new file mode 100644 index 0000000..f43b845 Binary files /dev/null and b/profiles/Avatar/One Piece/egghead-zoro.png differ diff --git a/profiles/Avatar/One Piece/one-piece-chopper-1.png b/profiles/Avatar/One Piece/one-piece-chopper-1.png new file mode 100644 index 0000000..488a4dd Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-chopper-1.png differ diff --git a/profiles/Avatar/One Piece/one-piece-chopper-2.png b/profiles/Avatar/One Piece/one-piece-chopper-2.png new file mode 100644 index 0000000..d16f259 Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-chopper-2.png differ diff --git a/profiles/Avatar/One Piece/one-piece-chopper-3.png b/profiles/Avatar/One Piece/one-piece-chopper-3.png new file mode 100644 index 0000000..41f0b6f Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-chopper-3.png differ diff --git a/profiles/Avatar/One Piece/one-piece-franky-1.png b/profiles/Avatar/One Piece/one-piece-franky-1.png new file mode 100644 index 0000000..7298d9e Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-franky-1.png differ diff --git a/profiles/Avatar/One Piece/one-piece-franky-2.png b/profiles/Avatar/One Piece/one-piece-franky-2.png new file mode 100644 index 0000000..e4d71a2 Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-franky-2.png differ diff --git a/profiles/Avatar/One Piece/one-piece-franky-3.png b/profiles/Avatar/One Piece/one-piece-franky-3.png new file mode 100644 index 0000000..5d6ad2e Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-franky-3.png differ diff --git a/profiles/Avatar/One Piece/one-piece-jimbei-1.png b/profiles/Avatar/One Piece/one-piece-jimbei-1.png new file mode 100644 index 0000000..d4fb21e Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-jimbei-1.png differ diff --git a/profiles/Avatar/One Piece/one-piece-jimbei-2.png b/profiles/Avatar/One Piece/one-piece-jimbei-2.png new file mode 100644 index 0000000..dbc7648 Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-jimbei-2.png differ diff --git a/profiles/Avatar/One Piece/one-piece-jimbei-3.png b/profiles/Avatar/One Piece/one-piece-jimbei-3.png new file mode 100644 index 0000000..6b3beb0 Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-jimbei-3.png differ diff --git a/profiles/Avatar/One Piece/one-piece-jimbei-4.png b/profiles/Avatar/One Piece/one-piece-jimbei-4.png new file mode 100644 index 0000000..b36aadd Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-jimbei-4.png differ diff --git a/profiles/Avatar/One Piece/one-piece-luffy-1.png b/profiles/Avatar/One Piece/one-piece-luffy-1.png new file mode 100644 index 0000000..ef271c6 Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-luffy-1.png differ diff --git a/profiles/Avatar/One Piece/one-piece-luffy-2.png b/profiles/Avatar/One Piece/one-piece-luffy-2.png new file mode 100644 index 0000000..382667a Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-luffy-2.png differ diff --git a/profiles/Avatar/One Piece/one-piece-luffy-3.png b/profiles/Avatar/One Piece/one-piece-luffy-3.png new file mode 100644 index 0000000..3ca6c1d Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-luffy-3.png differ diff --git a/profiles/Avatar/One Piece/one-piece-luffy-4.png b/profiles/Avatar/One Piece/one-piece-luffy-4.png new file mode 100644 index 0000000..edd54e3 Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-luffy-4.png differ diff --git a/profiles/Avatar/One Piece/one-piece-luffy-5.png b/profiles/Avatar/One Piece/one-piece-luffy-5.png new file mode 100644 index 0000000..db6fe9a Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-luffy-5.png differ diff --git a/profiles/Avatar/One Piece/one-piece-nico-robin-1.png b/profiles/Avatar/One Piece/one-piece-nico-robin-1.png new file mode 100644 index 0000000..52e5fcf Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-nico-robin-1.png differ diff --git a/profiles/Avatar/One Piece/one-piece-nico-robin-2.png b/profiles/Avatar/One Piece/one-piece-nico-robin-2.png new file mode 100644 index 0000000..5894d75 Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-nico-robin-2.png differ diff --git a/profiles/Avatar/One Piece/one-piece-nico-robin-3.png b/profiles/Avatar/One Piece/one-piece-nico-robin-3.png new file mode 100644 index 0000000..d8b4c51 Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-nico-robin-3.png differ diff --git a/profiles/Avatar/One Piece/one-piece-roronoa-zoro-1.png b/profiles/Avatar/One Piece/one-piece-roronoa-zoro-1.png new file mode 100644 index 0000000..84e32f1 Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-roronoa-zoro-1.png differ diff --git a/profiles/Avatar/One Piece/one-piece-roronoa-zoro-2.png b/profiles/Avatar/One Piece/one-piece-roronoa-zoro-2.png new file mode 100644 index 0000000..2c9d535 Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-roronoa-zoro-2.png differ diff --git a/profiles/Avatar/One Piece/one-piece-sanji-1.png b/profiles/Avatar/One Piece/one-piece-sanji-1.png new file mode 100644 index 0000000..5855337 Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-sanji-1.png differ diff --git a/profiles/Avatar/One Piece/one-piece-sanji-2.png b/profiles/Avatar/One Piece/one-piece-sanji-2.png new file mode 100644 index 0000000..58ce4a5 Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-sanji-2.png differ diff --git a/profiles/Avatar/One Piece/one-piece-sanji-3.png b/profiles/Avatar/One Piece/one-piece-sanji-3.png new file mode 100644 index 0000000..3c83a1d Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-sanji-3.png differ diff --git a/profiles/Avatar/One Piece/one-piece-usopp-1.png b/profiles/Avatar/One Piece/one-piece-usopp-1.png new file mode 100644 index 0000000..0b5dcc6 Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-usopp-1.png differ diff --git a/profiles/Avatar/One Piece/one-piece-usopp-2.png b/profiles/Avatar/One Piece/one-piece-usopp-2.png new file mode 100644 index 0000000..b31fe0c Binary files /dev/null and b/profiles/Avatar/One Piece/one-piece-usopp-2.png differ diff --git a/profiles/Avatar/One Piece_ Gear Five/gear5avatar1.png b/profiles/Avatar/One Piece_ Gear Five/gear5avatar1.png new file mode 100644 index 0000000..609d8d4 Binary files /dev/null and b/profiles/Avatar/One Piece_ Gear Five/gear5avatar1.png differ diff --git a/profiles/Avatar/One Piece_ Gear Five/gear5avatar2.png b/profiles/Avatar/One Piece_ Gear Five/gear5avatar2.png new file mode 100644 index 0000000..d0d945d Binary files /dev/null and b/profiles/Avatar/One Piece_ Gear Five/gear5avatar2.png differ diff --git a/profiles/Avatar/One Piece_ Gear Five/gear5avatar3.png b/profiles/Avatar/One Piece_ Gear Five/gear5avatar3.png new file mode 100644 index 0000000..e372f9b Binary files /dev/null and b/profiles/Avatar/One Piece_ Gear Five/gear5avatar3.png differ diff --git a/profiles/Avatar/One Piece_ Gear Five/gear5avatar4.png b/profiles/Avatar/One Piece_ Gear Five/gear5avatar4.png new file mode 100644 index 0000000..adef69a Binary files /dev/null and b/profiles/Avatar/One Piece_ Gear Five/gear5avatar4.png differ diff --git a/profiles/Avatar/One Piece_ Gear Five/gear5avatar5.png b/profiles/Avatar/One Piece_ Gear Five/gear5avatar5.png new file mode 100644 index 0000000..697bd79 Binary files /dev/null and b/profiles/Avatar/One Piece_ Gear Five/gear5avatar5.png differ diff --git a/profiles/Avatar/One Piece_ Gear Five/gear5avatar6.png b/profiles/Avatar/One Piece_ Gear Five/gear5avatar6.png new file mode 100644 index 0000000..725ebf2 Binary files /dev/null and b/profiles/Avatar/One Piece_ Gear Five/gear5avatar6.png differ diff --git a/profiles/Avatar/One Piece_ Gear Five/gear5avatar7.png b/profiles/Avatar/One Piece_ Gear Five/gear5avatar7.png new file mode 100644 index 0000000..cdf88ab Binary files /dev/null and b/profiles/Avatar/One Piece_ Gear Five/gear5avatar7.png differ diff --git a/profiles/Avatar/One Piece_ Gear Five/gear5avatar8.png b/profiles/Avatar/One Piece_ Gear Five/gear5avatar8.png new file mode 100644 index 0000000..f2503f2 Binary files /dev/null and b/profiles/Avatar/One Piece_ Gear Five/gear5avatar8.png differ diff --git a/profiles/Avatar/One Piece_ Gear Five/gear5avatar9.png b/profiles/Avatar/One Piece_ Gear Five/gear5avatar9.png new file mode 100644 index 0000000..ff2daf0 Binary files /dev/null and b/profiles/Avatar/One Piece_ Gear Five/gear5avatar9.png differ diff --git a/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-chizuru-s1-date-kv.png b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-chizuru-s1-date-kv.png new file mode 100644 index 0000000..6765a4b Binary files /dev/null and b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-chizuru-s1-date-kv.png differ diff --git a/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-chizuru-s2-date-kv.png b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-chizuru-s2-date-kv.png new file mode 100644 index 0000000..eae4140 Binary files /dev/null and b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-chizuru-s2-date-kv.png differ diff --git a/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-chizuru-s3-date-kv.png b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-chizuru-s3-date-kv.png new file mode 100644 index 0000000..13adb56 Binary files /dev/null and b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-chizuru-s3-date-kv.png differ diff --git a/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-mami-s1-date-kv.png b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-mami-s1-date-kv.png new file mode 100644 index 0000000..23caab2 Binary files /dev/null and b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-mami-s1-date-kv.png differ diff --git a/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-mami-s2-date-kv_1.png b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-mami-s2-date-kv_1.png new file mode 100644 index 0000000..34d5450 Binary files /dev/null and b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-mami-s2-date-kv_1.png differ diff --git a/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-mami-s2-date-kv_2.png b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-mami-s2-date-kv_2.png new file mode 100644 index 0000000..a38e223 Binary files /dev/null and b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-mami-s2-date-kv_2.png differ diff --git a/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-mami-s3-date-kv_1.png b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-mami-s3-date-kv_1.png new file mode 100644 index 0000000..ea850e0 Binary files /dev/null and b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-mami-s3-date-kv_1.png differ diff --git a/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-mami-s3-date-kv_2.png b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-mami-s3-date-kv_2.png new file mode 100644 index 0000000..034f597 Binary files /dev/null and b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-mami-s3-date-kv_2.png differ diff --git a/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-ruka-s1-date-kv.png b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-ruka-s1-date-kv.png new file mode 100644 index 0000000..3899157 Binary files /dev/null and b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-ruka-s1-date-kv.png differ diff --git a/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-ruka-s2-date-kv.png b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-ruka-s2-date-kv.png new file mode 100644 index 0000000..e9d5d88 Binary files /dev/null and b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-ruka-s2-date-kv.png differ diff --git a/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-ruka-s3-date-kv.png b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-ruka-s3-date-kv.png new file mode 100644 index 0000000..55c4e04 Binary files /dev/null and b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-ruka-s3-date-kv.png differ diff --git a/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-sumi-s1-date-kv.png b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-sumi-s1-date-kv.png new file mode 100644 index 0000000..7f46964 Binary files /dev/null and b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-sumi-s1-date-kv.png differ diff --git a/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-yaemori-s3-date-kv.png b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-yaemori-s3-date-kv.png new file mode 100644 index 0000000..53177f9 Binary files /dev/null and b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-yaemori-s3-date-kv.png differ diff --git a/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-yaemori-s3-main-kv.png b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-yaemori-s3-main-kv.png new file mode 100644 index 0000000..6a672aa Binary files /dev/null and b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-yaemori-s3-main-kv.png differ diff --git a/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-yaemori-s3-teaser-kv.png b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-yaemori-s3-teaser-kv.png new file mode 100644 index 0000000..43d1c86 Binary files /dev/null and b/profiles/Avatar/Rent-a-Girlfriend/rent-a-gf-yaemori-s3-teaser-kv.png differ diff --git a/profiles/Avatar/SPY x FAMILY/100006-spy-x-family-loid.png b/profiles/Avatar/SPY x FAMILY/100006-spy-x-family-loid.png new file mode 100644 index 0000000..bc69f6d Binary files /dev/null and b/profiles/Avatar/SPY x FAMILY/100006-spy-x-family-loid.png differ diff --git a/profiles/Avatar/SPY x FAMILY/100007-spy-x-family-yor.png b/profiles/Avatar/SPY x FAMILY/100007-spy-x-family-yor.png new file mode 100644 index 0000000..b9b2511 Binary files /dev/null and b/profiles/Avatar/SPY x FAMILY/100007-spy-x-family-yor.png differ diff --git a/profiles/Avatar/SPY x FAMILY/100008-spy-x-family-anya-1.png b/profiles/Avatar/SPY x FAMILY/100008-spy-x-family-anya-1.png new file mode 100644 index 0000000..5b29c35 Binary files /dev/null and b/profiles/Avatar/SPY x FAMILY/100008-spy-x-family-anya-1.png differ diff --git a/profiles/Avatar/SPY x FAMILY/100009-spy-x-family-anya-2.png b/profiles/Avatar/SPY x FAMILY/100009-spy-x-family-anya-2.png new file mode 100644 index 0000000..9a93d6f Binary files /dev/null and b/profiles/Avatar/SPY x FAMILY/100009-spy-x-family-anya-2.png differ diff --git a/profiles/Avatar/SPY x FAMILY/100010-spy-x-family-anya-3.png b/profiles/Avatar/SPY x FAMILY/100010-spy-x-family-anya-3.png new file mode 100644 index 0000000..d35285c Binary files /dev/null and b/profiles/Avatar/SPY x FAMILY/100010-spy-x-family-anya-3.png differ diff --git a/profiles/Avatar/So I'm a Spider, So What_/1051-so-im-a-spider-so-what-kumoko.png b/profiles/Avatar/So I'm a Spider, So What_/1051-so-im-a-spider-so-what-kumoko.png new file mode 100644 index 0000000..ea2fc09 Binary files /dev/null and b/profiles/Avatar/So I'm a Spider, So What_/1051-so-im-a-spider-so-what-kumoko.png differ diff --git a/profiles/Avatar/So I'm a Spider, So What_/1052-so-im-a-spider-so-what-shun.png b/profiles/Avatar/So I'm a Spider, So What_/1052-so-im-a-spider-so-what-shun.png new file mode 100644 index 0000000..0a8f7b6 Binary files /dev/null and b/profiles/Avatar/So I'm a Spider, So What_/1052-so-im-a-spider-so-what-shun.png differ diff --git a/profiles/Avatar/So I'm a Spider, So What_/1053-so-im-a-spider-so-what-katia.png b/profiles/Avatar/So I'm a Spider, So What_/1053-so-im-a-spider-so-what-katia.png new file mode 100644 index 0000000..4edc075 Binary files /dev/null and b/profiles/Avatar/So I'm a Spider, So What_/1053-so-im-a-spider-so-what-katia.png differ diff --git a/profiles/Avatar/So I'm a Spider, So What_/1054-so-im-a-spider-so-what-sue.png b/profiles/Avatar/So I'm a Spider, So What_/1054-so-im-a-spider-so-what-sue.png new file mode 100644 index 0000000..a140e83 Binary files /dev/null and b/profiles/Avatar/So I'm a Spider, So What_/1054-so-im-a-spider-so-what-sue.png differ diff --git a/profiles/Avatar/So I'm a Spider, So What_/1055-so-im-a-spider-so-what-fei.png b/profiles/Avatar/So I'm a Spider, So What_/1055-so-im-a-spider-so-what-fei.png new file mode 100644 index 0000000..666c0d0 Binary files /dev/null and b/profiles/Avatar/So I'm a Spider, So What_/1055-so-im-a-spider-so-what-fei.png differ diff --git a/profiles/Avatar/Solo Leveling/solo_baekyoonho.png b/profiles/Avatar/Solo Leveling/solo_baekyoonho.png new file mode 100644 index 0000000..a9db75a Binary files /dev/null and b/profiles/Avatar/Solo Leveling/solo_baekyoonho.png differ diff --git a/profiles/Avatar/Solo Leveling/solo_chahaein.png b/profiles/Avatar/Solo Leveling/solo_chahaein.png new file mode 100644 index 0000000..5122f6c Binary files /dev/null and b/profiles/Avatar/Solo Leveling/solo_chahaein.png differ diff --git a/profiles/Avatar/Solo Leveling/solo_choijongin.png b/profiles/Avatar/Solo Leveling/solo_choijongin.png new file mode 100644 index 0000000..d6b7b49 Binary files /dev/null and b/profiles/Avatar/Solo Leveling/solo_choijongin.png differ diff --git a/profiles/Avatar/Solo Leveling/solo_gogunhee.png b/profiles/Avatar/Solo Leveling/solo_gogunhee.png new file mode 100644 index 0000000..1c2ff94 Binary files /dev/null and b/profiles/Avatar/Solo Leveling/solo_gogunhee.png differ diff --git a/profiles/Avatar/Solo Leveling/solo_sungjinwoo.png b/profiles/Avatar/Solo Leveling/solo_sungjinwoo.png new file mode 100644 index 0000000..aae1a08 Binary files /dev/null and b/profiles/Avatar/Solo Leveling/solo_sungjinwoo.png differ diff --git a/profiles/Avatar/Solo Leveling/solo_teaser_visual.png b/profiles/Avatar/Solo Leveling/solo_teaser_visual.png new file mode 100644 index 0000000..886da63 Binary files /dev/null and b/profiles/Avatar/Solo Leveling/solo_teaser_visual.png differ diff --git a/profiles/Avatar/Solo Leveling/solo_woojinchul.png b/profiles/Avatar/Solo Leveling/solo_woojinchul.png new file mode 100644 index 0000000..92794cc Binary files /dev/null and b/profiles/Avatar/Solo Leveling/solo_woojinchul.png differ diff --git a/profiles/Avatar/Solo Leveling/solo_yoojinho.png b/profiles/Avatar/Solo Leveling/solo_yoojinho.png new file mode 100644 index 0000000..0b4224b Binary files /dev/null and b/profiles/Avatar/Solo Leveling/solo_yoojinho.png differ diff --git a/profiles/Avatar/Somali and the Forest Spirit/31-somali-and-the-forest-spirit-golem.jpg b/profiles/Avatar/Somali and the Forest Spirit/31-somali-and-the-forest-spirit-golem.jpg new file mode 100644 index 0000000..6b7c099 Binary files /dev/null and b/profiles/Avatar/Somali and the Forest Spirit/31-somali-and-the-forest-spirit-golem.jpg differ diff --git a/profiles/Avatar/Somali and the Forest Spirit/32-somali-and-the-forest-spirit-somali.jpg b/profiles/Avatar/Somali and the Forest Spirit/32-somali-and-the-forest-spirit-somali.jpg new file mode 100644 index 0000000..be3ea87 Binary files /dev/null and b/profiles/Avatar/Somali and the Forest Spirit/32-somali-and-the-forest-spirit-somali.jpg differ diff --git a/profiles/Avatar/Somali and the Forest Spirit/33-somali-and-the-forest-spirit-shizuno.jpg b/profiles/Avatar/Somali and the Forest Spirit/33-somali-and-the-forest-spirit-shizuno.jpg new file mode 100644 index 0000000..c05286a Binary files /dev/null and b/profiles/Avatar/Somali and the Forest Spirit/33-somali-and-the-forest-spirit-shizuno.jpg differ diff --git a/profiles/Avatar/Somali and the Forest Spirit/34-somali-and-the-forest-spirit-uzoi.jpg b/profiles/Avatar/Somali and the Forest Spirit/34-somali-and-the-forest-spirit-uzoi.jpg new file mode 100644 index 0000000..1f44f7e Binary files /dev/null and b/profiles/Avatar/Somali and the Forest Spirit/34-somali-and-the-forest-spirit-uzoi.jpg differ diff --git a/profiles/Avatar/Somali and the Forest Spirit/35-somali-and-the-forest-spirit-kikila.jpg b/profiles/Avatar/Somali and the Forest Spirit/35-somali-and-the-forest-spirit-kikila.jpg new file mode 100644 index 0000000..095458c Binary files /dev/null and b/profiles/Avatar/Somali and the Forest Spirit/35-somali-and-the-forest-spirit-kikila.jpg differ diff --git a/profiles/Avatar/That Time I Got Reincarnated as a Slime/36-that-time-i-got-reincarnated-as-a-slime-rimuru-human.png b/profiles/Avatar/That Time I Got Reincarnated as a Slime/36-that-time-i-got-reincarnated-as-a-slime-rimuru-human.png new file mode 100644 index 0000000..a37d3cf Binary files /dev/null and b/profiles/Avatar/That Time I Got Reincarnated as a Slime/36-that-time-i-got-reincarnated-as-a-slime-rimuru-human.png differ diff --git a/profiles/Avatar/That Time I Got Reincarnated as a Slime/37-that-time-i-got-reincarnated-as-a-slime-shuna.png b/profiles/Avatar/That Time I Got Reincarnated as a Slime/37-that-time-i-got-reincarnated-as-a-slime-shuna.png new file mode 100644 index 0000000..1d54f25 Binary files /dev/null and b/profiles/Avatar/That Time I Got Reincarnated as a Slime/37-that-time-i-got-reincarnated-as-a-slime-shuna.png differ diff --git a/profiles/Avatar/That Time I Got Reincarnated as a Slime/38-that-time-i-got-reincarnated-as-a-slime-shion.png b/profiles/Avatar/That Time I Got Reincarnated as a Slime/38-that-time-i-got-reincarnated-as-a-slime-shion.png new file mode 100644 index 0000000..ad5dcde Binary files /dev/null and b/profiles/Avatar/That Time I Got Reincarnated as a Slime/38-that-time-i-got-reincarnated-as-a-slime-shion.png differ diff --git a/profiles/Avatar/That Time I Got Reincarnated as a Slime/39-that-time-i-got-reincarnated-as-a-slime-rimuru-slime.png b/profiles/Avatar/That Time I Got Reincarnated as a Slime/39-that-time-i-got-reincarnated-as-a-slime-rimuru-slime.png new file mode 100644 index 0000000..e8f79f5 Binary files /dev/null and b/profiles/Avatar/That Time I Got Reincarnated as a Slime/39-that-time-i-got-reincarnated-as-a-slime-rimuru-slime.png differ diff --git a/profiles/Avatar/That Time I Got Reincarnated as a Slime/40-that-time-i-got-reincarnated-as-a-slime-hinata.png b/profiles/Avatar/That Time I Got Reincarnated as a Slime/40-that-time-i-got-reincarnated-as-a-slime-hinata.png new file mode 100644 index 0000000..b9ad2a7 Binary files /dev/null and b/profiles/Avatar/That Time I Got Reincarnated as a Slime/40-that-time-i-got-reincarnated-as-a-slime-hinata.png differ diff --git a/profiles/Avatar/The Apothecary Diaries/apothecary_gaoshun.png b/profiles/Avatar/The Apothecary Diaries/apothecary_gaoshun.png new file mode 100644 index 0000000..003b2e1 Binary files /dev/null and b/profiles/Avatar/The Apothecary Diaries/apothecary_gaoshun.png differ diff --git a/profiles/Avatar/The Apothecary Diaries/apothecary_gyokuyou.png b/profiles/Avatar/The Apothecary Diaries/apothecary_gyokuyou.png new file mode 100644 index 0000000..c9bc20e Binary files /dev/null and b/profiles/Avatar/The Apothecary Diaries/apothecary_gyokuyou.png differ diff --git a/profiles/Avatar/The Apothecary Diaries/apothecary_jinshi-1.png b/profiles/Avatar/The Apothecary Diaries/apothecary_jinshi-1.png new file mode 100644 index 0000000..448903e Binary files /dev/null and b/profiles/Avatar/The Apothecary Diaries/apothecary_jinshi-1.png differ diff --git a/profiles/Avatar/The Apothecary Diaries/apothecary_jinshi-2.png b/profiles/Avatar/The Apothecary Diaries/apothecary_jinshi-2.png new file mode 100644 index 0000000..867c232 Binary files /dev/null and b/profiles/Avatar/The Apothecary Diaries/apothecary_jinshi-2.png differ diff --git a/profiles/Avatar/The Apothecary Diaries/apothecary_lihaku.png b/profiles/Avatar/The Apothecary Diaries/apothecary_lihaku.png new file mode 100644 index 0000000..06b69c2 Binary files /dev/null and b/profiles/Avatar/The Apothecary Diaries/apothecary_lihaku.png differ diff --git a/profiles/Avatar/The Apothecary Diaries/apothecary_maomao-1.png b/profiles/Avatar/The Apothecary Diaries/apothecary_maomao-1.png new file mode 100644 index 0000000..b31e6f8 Binary files /dev/null and b/profiles/Avatar/The Apothecary Diaries/apothecary_maomao-1.png differ diff --git a/profiles/Avatar/The Apothecary Diaries/apothecary_maomao-2.png b/profiles/Avatar/The Apothecary Diaries/apothecary_maomao-2.png new file mode 100644 index 0000000..b57b82c Binary files /dev/null and b/profiles/Avatar/The Apothecary Diaries/apothecary_maomao-2.png differ diff --git a/profiles/Avatar/The Apothecary Diaries/apothecary_xiaolan.png b/profiles/Avatar/The Apothecary Diaries/apothecary_xiaolan.png new file mode 100644 index 0000000..54dfaca Binary files /dev/null and b/profiles/Avatar/The Apothecary Diaries/apothecary_xiaolan.png differ diff --git a/profiles/Avatar/The God of High School/16-the-god-of-high-school-jin-mori.png b/profiles/Avatar/The God of High School/16-the-god-of-high-school-jin-mori.png new file mode 100644 index 0000000..83f5e9e Binary files /dev/null and b/profiles/Avatar/The God of High School/16-the-god-of-high-school-jin-mori.png differ diff --git a/profiles/Avatar/The God of High School/17-the-god-of-high-school-han-daewi.png b/profiles/Avatar/The God of High School/17-the-god-of-high-school-han-daewi.png new file mode 100644 index 0000000..12199ef Binary files /dev/null and b/profiles/Avatar/The God of High School/17-the-god-of-high-school-han-daewi.png differ diff --git a/profiles/Avatar/The God of High School/18-the-god-of-high-school-yoo-mira.png b/profiles/Avatar/The God of High School/18-the-god-of-high-school-yoo-mira.png new file mode 100644 index 0000000..d6af18b Binary files /dev/null and b/profiles/Avatar/The God of High School/18-the-god-of-high-school-yoo-mira.png differ diff --git a/profiles/Avatar/The God of High School/19-the-god-of-high-school-park-mujin.png b/profiles/Avatar/The God of High School/19-the-god-of-high-school-park-mujin.png new file mode 100644 index 0000000..1fee0dd Binary files /dev/null and b/profiles/Avatar/The God of High School/19-the-god-of-high-school-park-mujin.png differ diff --git a/profiles/Avatar/The God of High School/20-the-god-of-high-school-park-ilpyo.png b/profiles/Avatar/The God of High School/20-the-god-of-high-school-park-ilpyo.png new file mode 100644 index 0000000..5839059 Binary files /dev/null and b/profiles/Avatar/The God of High School/20-the-god-of-high-school-park-ilpyo.png differ diff --git a/profiles/Avatar/The Rising of the Shield Hero/100001-the-rising-of-the-shield-hero-naofumi.png b/profiles/Avatar/The Rising of the Shield Hero/100001-the-rising-of-the-shield-hero-naofumi.png new file mode 100644 index 0000000..440bbbe Binary files /dev/null and b/profiles/Avatar/The Rising of the Shield Hero/100001-the-rising-of-the-shield-hero-naofumi.png differ diff --git a/profiles/Avatar/The Rising of the Shield Hero/100002-the-rising-of-the-shield-hero-raphtalia.png b/profiles/Avatar/The Rising of the Shield Hero/100002-the-rising-of-the-shield-hero-raphtalia.png new file mode 100644 index 0000000..d50596f Binary files /dev/null and b/profiles/Avatar/The Rising of the Shield Hero/100002-the-rising-of-the-shield-hero-raphtalia.png differ diff --git a/profiles/Avatar/The Rising of the Shield Hero/100003-the-rising-of-the-shield-hero-filo.png b/profiles/Avatar/The Rising of the Shield Hero/100003-the-rising-of-the-shield-hero-filo.png new file mode 100644 index 0000000..cd2a07b Binary files /dev/null and b/profiles/Avatar/The Rising of the Shield Hero/100003-the-rising-of-the-shield-hero-filo.png differ diff --git a/profiles/Avatar/The Rising of the Shield Hero/100004-the-rising-of-the-shield-hero-melty.png b/profiles/Avatar/The Rising of the Shield Hero/100004-the-rising-of-the-shield-hero-melty.png new file mode 100644 index 0000000..ed6041f Binary files /dev/null and b/profiles/Avatar/The Rising of the Shield Hero/100004-the-rising-of-the-shield-hero-melty.png differ diff --git a/profiles/Avatar/The Rising of the Shield Hero/100005-the-rising-of-the-shield-hero-rishia.png b/profiles/Avatar/The Rising of the Shield Hero/100005-the-rising-of-the-shield-hero-rishia.png new file mode 100644 index 0000000..b0fa3cc Binary files /dev/null and b/profiles/Avatar/The Rising of the Shield Hero/100005-the-rising-of-the-shield-hero-rishia.png differ diff --git a/profiles/Avatar/The World's Finest Assassin Gets Reincarnated in Another World as an Aristocrat/1001-the-worlds-finest-assassin-lugh.png b/profiles/Avatar/The World's Finest Assassin Gets Reincarnated in Another World as an Aristocrat/1001-the-worlds-finest-assassin-lugh.png new file mode 100644 index 0000000..299e4a2 Binary files /dev/null and b/profiles/Avatar/The World's Finest Assassin Gets Reincarnated in Another World as an Aristocrat/1001-the-worlds-finest-assassin-lugh.png differ diff --git a/profiles/Avatar/The World's Finest Assassin Gets Reincarnated in Another World as an Aristocrat/1002-the-worlds-finest-assassin-dia.png b/profiles/Avatar/The World's Finest Assassin Gets Reincarnated in Another World as an Aristocrat/1002-the-worlds-finest-assassin-dia.png new file mode 100644 index 0000000..e1d715b Binary files /dev/null and b/profiles/Avatar/The World's Finest Assassin Gets Reincarnated in Another World as an Aristocrat/1002-the-worlds-finest-assassin-dia.png differ diff --git a/profiles/Avatar/The World's Finest Assassin Gets Reincarnated in Another World as an Aristocrat/1003-the-worlds-finest-assassin-tart.png b/profiles/Avatar/The World's Finest Assassin Gets Reincarnated in Another World as an Aristocrat/1003-the-worlds-finest-assassin-tart.png new file mode 100644 index 0000000..fa56479 Binary files /dev/null and b/profiles/Avatar/The World's Finest Assassin Gets Reincarnated in Another World as an Aristocrat/1003-the-worlds-finest-assassin-tart.png differ diff --git a/profiles/Avatar/The World's Finest Assassin Gets Reincarnated in Another World as an Aristocrat/1004-the-worlds-finest-assassin-maha.png b/profiles/Avatar/The World's Finest Assassin Gets Reincarnated in Another World as an Aristocrat/1004-the-worlds-finest-assassin-maha.png new file mode 100644 index 0000000..18d8e48 Binary files /dev/null and b/profiles/Avatar/The World's Finest Assassin Gets Reincarnated in Another World as an Aristocrat/1004-the-worlds-finest-assassin-maha.png differ diff --git a/profiles/Avatar/The World's Finest Assassin Gets Reincarnated in Another World as an Aristocrat/1005-the-worlds-finest-assassin-assassin.png b/profiles/Avatar/The World's Finest Assassin Gets Reincarnated in Another World as an Aristocrat/1005-the-worlds-finest-assassin-assassin.png new file mode 100644 index 0000000..afebfd5 Binary files /dev/null and b/profiles/Avatar/The World's Finest Assassin Gets Reincarnated in Another World as an Aristocrat/1005-the-worlds-finest-assassin-assassin.png differ diff --git a/profiles/Avatar/To Your Eternity/1021-to-your-eternity-fushi.png b/profiles/Avatar/To Your Eternity/1021-to-your-eternity-fushi.png new file mode 100644 index 0000000..258f198 Binary files /dev/null and b/profiles/Avatar/To Your Eternity/1021-to-your-eternity-fushi.png differ diff --git a/profiles/Avatar/To Your Eternity/1022-to-your-eternity-joann.png b/profiles/Avatar/To Your Eternity/1022-to-your-eternity-joann.png new file mode 100644 index 0000000..5f39102 Binary files /dev/null and b/profiles/Avatar/To Your Eternity/1022-to-your-eternity-joann.png differ diff --git a/profiles/Avatar/To Your Eternity/1023-to-your-eternity-march.png b/profiles/Avatar/To Your Eternity/1023-to-your-eternity-march.png new file mode 100644 index 0000000..282419b Binary files /dev/null and b/profiles/Avatar/To Your Eternity/1023-to-your-eternity-march.png differ diff --git a/profiles/Avatar/To Your Eternity/1024-to-your-eternity-parona.png b/profiles/Avatar/To Your Eternity/1024-to-your-eternity-parona.png new file mode 100644 index 0000000..15093d2 Binary files /dev/null and b/profiles/Avatar/To Your Eternity/1024-to-your-eternity-parona.png differ diff --git a/profiles/Avatar/To Your Eternity/1025-to-your-eternity-thebeholder.png b/profiles/Avatar/To Your Eternity/1025-to-your-eternity-thebeholder.png new file mode 100644 index 0000000..29e43f3 Binary files /dev/null and b/profiles/Avatar/To Your Eternity/1025-to-your-eternity-thebeholder.png differ diff --git a/profiles/Avatar/To Your Eternity/1026-to-your-eternity-gugu.png b/profiles/Avatar/To Your Eternity/1026-to-your-eternity-gugu.png new file mode 100644 index 0000000..8ff8169 Binary files /dev/null and b/profiles/Avatar/To Your Eternity/1026-to-your-eternity-gugu.png differ diff --git a/profiles/Avatar/To Your Eternity/1027-to-your-eternity-tonari.png b/profiles/Avatar/To Your Eternity/1027-to-your-eternity-tonari.png new file mode 100644 index 0000000..f661ab9 Binary files /dev/null and b/profiles/Avatar/To Your Eternity/1027-to-your-eternity-tonari.png differ diff --git a/profiles/Avatar/To Your Eternity/1028-to-your-eternity-theboy.png b/profiles/Avatar/To Your Eternity/1028-to-your-eternity-theboy.png new file mode 100644 index 0000000..c5a6c38 Binary files /dev/null and b/profiles/Avatar/To Your Eternity/1028-to-your-eternity-theboy.png differ diff --git a/profiles/Avatar/To Your Eternity/1029-to-your-eternity-fushi.png b/profiles/Avatar/To Your Eternity/1029-to-your-eternity-fushi.png new file mode 100644 index 0000000..0f72d4d Binary files /dev/null and b/profiles/Avatar/To Your Eternity/1029-to-your-eternity-fushi.png differ diff --git a/profiles/Avatar/To Your Eternity/1030-to-your-eternity-march.png b/profiles/Avatar/To Your Eternity/1030-to-your-eternity-march.png new file mode 100644 index 0000000..5019d46 Binary files /dev/null and b/profiles/Avatar/To Your Eternity/1030-to-your-eternity-march.png differ diff --git a/profiles/Avatar/Tokyo Revengers/1036-tokyo-revengers-takemichi.png b/profiles/Avatar/Tokyo Revengers/1036-tokyo-revengers-takemichi.png new file mode 100644 index 0000000..4cc6d87 Binary files /dev/null and b/profiles/Avatar/Tokyo Revengers/1036-tokyo-revengers-takemichi.png differ diff --git a/profiles/Avatar/Tokyo Revengers/1037-tokyo-revengers-mikey.png b/profiles/Avatar/Tokyo Revengers/1037-tokyo-revengers-mikey.png new file mode 100644 index 0000000..b4d0e36 Binary files /dev/null and b/profiles/Avatar/Tokyo Revengers/1037-tokyo-revengers-mikey.png differ diff --git a/profiles/Avatar/Tokyo Revengers/1038-tokyo-revengers-draken.png b/profiles/Avatar/Tokyo Revengers/1038-tokyo-revengers-draken.png new file mode 100644 index 0000000..6dd54ae Binary files /dev/null and b/profiles/Avatar/Tokyo Revengers/1038-tokyo-revengers-draken.png differ diff --git a/profiles/Avatar/Tokyo Revengers/1039-tokyo-revengers-mitsuya.png b/profiles/Avatar/Tokyo Revengers/1039-tokyo-revengers-mitsuya.png new file mode 100644 index 0000000..980a853 Binary files /dev/null and b/profiles/Avatar/Tokyo Revengers/1039-tokyo-revengers-mitsuya.png differ diff --git a/profiles/Avatar/Tokyo Revengers/1040-tokyo-revengers-baji.png b/profiles/Avatar/Tokyo Revengers/1040-tokyo-revengers-baji.png new file mode 100644 index 0000000..7e0e1e8 Binary files /dev/null and b/profiles/Avatar/Tokyo Revengers/1040-tokyo-revengers-baji.png differ diff --git a/profiles/Avatar/Tower of God/11-tower-of-god-bam.png b/profiles/Avatar/Tower of God/11-tower-of-god-bam.png new file mode 100644 index 0000000..763e635 Binary files /dev/null and b/profiles/Avatar/Tower of God/11-tower-of-god-bam.png differ diff --git a/profiles/Avatar/Tower of God/12-tower-of-god-khun.png b/profiles/Avatar/Tower of God/12-tower-of-god-khun.png new file mode 100644 index 0000000..2f09440 Binary files /dev/null and b/profiles/Avatar/Tower of God/12-tower-of-god-khun.png differ diff --git a/profiles/Avatar/Tower of God/13-tower-of-god-rak.png b/profiles/Avatar/Tower of God/13-tower-of-god-rak.png new file mode 100644 index 0000000..11e8ad7 Binary files /dev/null and b/profiles/Avatar/Tower of God/13-tower-of-god-rak.png differ diff --git a/profiles/Avatar/Tower of God/14-tower-of-god-yuri-jahad.png b/profiles/Avatar/Tower of God/14-tower-of-god-yuri-jahad.png new file mode 100644 index 0000000..75f4285 Binary files /dev/null and b/profiles/Avatar/Tower of God/14-tower-of-god-yuri-jahad.png differ diff --git a/profiles/Avatar/Tower of God/15-tower-of-god-endorsi-jahad.png b/profiles/Avatar/Tower of God/15-tower-of-god-endorsi-jahad.png new file mode 100644 index 0000000..4ff3825 Binary files /dev/null and b/profiles/Avatar/Tower of God/15-tower-of-god-endorsi-jahad.png differ diff --git a/profiles/Avatar/ZOMBIE LAND SAGA/41-zombieland-saga-revenge-sakura-minamoto.png b/profiles/Avatar/ZOMBIE LAND SAGA/41-zombieland-saga-revenge-sakura-minamoto.png new file mode 100644 index 0000000..cb8b959 Binary files /dev/null and b/profiles/Avatar/ZOMBIE LAND SAGA/41-zombieland-saga-revenge-sakura-minamoto.png differ diff --git a/profiles/Avatar/ZOMBIE LAND SAGA/42-zombieland-saga-revenge-saki-nikaido.png b/profiles/Avatar/ZOMBIE LAND SAGA/42-zombieland-saga-revenge-saki-nikaido.png new file mode 100644 index 0000000..d9a21c4 Binary files /dev/null and b/profiles/Avatar/ZOMBIE LAND SAGA/42-zombieland-saga-revenge-saki-nikaido.png differ diff --git a/profiles/Avatar/ZOMBIE LAND SAGA/43-zombieland-saga-revenge-ai-mizuno.png b/profiles/Avatar/ZOMBIE LAND SAGA/43-zombieland-saga-revenge-ai-mizuno.png new file mode 100644 index 0000000..f22f4f4 Binary files /dev/null and b/profiles/Avatar/ZOMBIE LAND SAGA/43-zombieland-saga-revenge-ai-mizuno.png differ diff --git a/profiles/Avatar/ZOMBIE LAND SAGA/44-zombieland-saga-revenge-junko-konno.png b/profiles/Avatar/ZOMBIE LAND SAGA/44-zombieland-saga-revenge-junko-konno.png new file mode 100644 index 0000000..a5ff294 Binary files /dev/null and b/profiles/Avatar/ZOMBIE LAND SAGA/44-zombieland-saga-revenge-junko-konno.png differ diff --git a/profiles/Avatar/ZOMBIE LAND SAGA/45-zombieland-saga-revenge-yugiri.png b/profiles/Avatar/ZOMBIE LAND SAGA/45-zombieland-saga-revenge-yugiri.png new file mode 100644 index 0000000..ad4616a Binary files /dev/null and b/profiles/Avatar/ZOMBIE LAND SAGA/45-zombieland-saga-revenge-yugiri.png differ diff --git a/profiles/Avatar/ZOMBIE LAND SAGA/46-zombieland-saga-revenge-lily-hoshikawa.png b/profiles/Avatar/ZOMBIE LAND SAGA/46-zombieland-saga-revenge-lily-hoshikawa.png new file mode 100644 index 0000000..294653e Binary files /dev/null and b/profiles/Avatar/ZOMBIE LAND SAGA/46-zombieland-saga-revenge-lily-hoshikawa.png differ diff --git a/profiles/Avatar/ZOMBIE LAND SAGA/47-zombieland-saga-revenge-tae-yamada.png b/profiles/Avatar/ZOMBIE LAND SAGA/47-zombieland-saga-revenge-tae-yamada.png new file mode 100644 index 0000000..ec11ce4 Binary files /dev/null and b/profiles/Avatar/ZOMBIE LAND SAGA/47-zombieland-saga-revenge-tae-yamada.png differ diff --git a/profiles/avatar.json b/profiles/avatar.json new file mode 100644 index 0000000..9bc6855 --- /dev/null +++ b/profiles/avatar.json @@ -0,0 +1,1437 @@ +{ + "items": [ + { + "title": "Crunchyroll", + "assets": [ + { + "id": "0001-cr-white-orange.png", + "title": "0001-cr-white-orange.png" + }, + { + "id": "0002-cr-orange-white.png", + "title": "0002-cr-orange-white.png" + }, + { + "id": "0003-cr-white-gradient1.png", + "title": "0003-cr-white-gradient1.png" + }, + { + "id": "0004-cr-white-gradient2.png", + "title": "0004-cr-white-gradient2.png" + }, + { + "id": "0005-cr-white-gradient3.png", + "title": "0005-cr-white-gradient3.png" + }, + { + "id": "0006-cr-white-black.png", + "title": "0006-cr-white-black.png" + }, + { + "id": "0007-cr-orange-blue.png", + "title": "0007-cr-orange-blue.png" + }, + { + "id": "0008-cr-orange-black.png", + "title": "0008-cr-orange-black.png" + }, + { + "id": "0009-cr-rainbow-white.png", + "title": "0009-cr-rainbow-white.png" + }, + { + "id": "0010-cr-white-rainbow.png", + "title": "0010-cr-white-rainbow.png" + }, + { + "id": "001-cr-hime-happy.png", + "title": "Happy Crunchyroll Hime" + }, + { + "id": "002-cr-hime-annoyed.png", + "title": "Annoyed Crunchyroll Hime" + }, + { + "id": "003-cr-hime-excited.png", + "title": "Excited Crunchyroll Hime" + }, + { + "id": "004-cr-hime-mischievous.png", + "title": "Mischievous Crunchyroll Hime" + }, + { + "id": "005-cr-hime-sleepy.png", + "title": "Sleepy Crunchyroll Hime" + }, + { + "id": "006-cr-hime-sad.png", + "title": "Crying Crunchyroll Hime" + }, + { + "id": "007-cr-hime-relaxed.png", + "title": "Relaxed Crunchyroll Hime" + }, + { + "id": "008-cr-hime-angry.png", + "title": "Angry Crunchyroll Hime" + }, + { + "id": "009-cr-hime-winking.png", + "title": "Winking Crunchyroll Hime" + }, + { + "id": "010-cr-hime-accomplished.png", + "title": "Peace Sign Crunchyroll Hime" + } + ] + }, + { + "title": "One Piece", + "assets": [ + { + "id": "egghead-luffy.png", + "title": "One Piece" + }, + { + "id": "egghead-nami.png", + "title": "One Piece" + }, + { + "id": "egghead-sanji.png", + "title": "One Piece" + }, + { + "id": "egghead-zoro.png", + "title": "One Piece" + }, + { + "id": "egghead-robin.png", + "title": "One Piece" + }, + { + "id": "egghead-chopper.png", + "title": "One Piece" + }, + { + "id": "egghead-usopp.png", + "title": "One Piece" + }, + { + "id": "egghead-franky.png", + "title": "One Piece" + }, + { + "id": "egghead-brook.png", + "title": "One Piece" + }, + { + "id": "egghead-jimbei.png", + "title": "One Piece" + }, + { + "id": "avatars-luffy.png", + "title": "luffy from one piece" + }, + { + "id": "avatars-law.png", + "title": "Law from One Piece" + }, + { + "id": "avatars-chopper.png", + "title": "Chopper from One Piece" + }, + { + "id": "avatars-kid.png", + "title": "Kid from One Piece" + }, + { + "id": "avatars-kaido.png", + "title": "Kaido from One Piece" + }, + { + "id": "avatars-jinbei.png", + "title": "Jinbei from One Piece" + }, + { + "id": "avatars-big_mom.png", + "title": "Big Mom from One Piece" + }, + { + "id": "avatars-usopp.png", + "title": "USOPP from One Piece" + }, + { + "id": "avatars-shanks.png", + "title": "Shanks from One Piece" + }, + { + "id": "avatars-sanji.png", + "title": "Sanji from One Piece" + }, + { + "id": "avatars-robin.png", + "title": "Robin from One Piece" + }, + { + "id": "avatars-zoro.png", + "title": "Zoro from One Piece" + }, + { + "id": "avatars-yamato.png", + "title": "Yamato from One Piece" + }, + { + "id": "avatars-perona.png", + "title": "Perona from One Piece" + }, + { + "id": "avatars-franky.png", + "title": "Franky from One Piece" + }, + { + "id": "avatars-brook.png", + "title": "Brook from One Piece" + }, + { + "id": "avatars-nami.png", + "title": "Nami from One Piece" + }, + { + "id": "one-piece-luffy-4.png", + "title": "Luffy from One Piece" + }, + { + "id": "one-piece-roronoa-zoro-1.png", + "title": "Roronoa Zoro from One PIece" + }, + { + "id": "one-piece-sanji-1.png", + "title": "Sanji from One Piece" + }, + { + "id": "one-piece-chopper-3.png", + "title": "Chopper from One Piece" + }, + { + "id": "one-piece-usopp-1.png", + "title": "Usopp from One PIece" + }, + { + "id": "one-piece-franky-3.png", + "title": "Franky from One Piece" + }, + { + "id": "one-piece-nico-robin-1.png", + "title": "Nico Robin from One Piece" + }, + { + "id": "one-piece-jimbei-3.png", + "title": "Jimbei from One Piece" + }, + { + "id": "one-piece-luffy-5.png", + "title": "Luffy from One Piece" + }, + { + "id": "one-piece-luffy-3.png", + "title": "Luffy from One Piece" + }, + { + "id": "one-piece-luffy-2.png", + "title": "Luffy from One Piece" + }, + { + "id": "one-piece-luffy-1.png", + "title": "Luffy from One Piece" + }, + { + "id": "one-piece-roronoa-zoro-2.png", + "title": "Roronoa Zoro from One PIece" + }, + { + "id": "one-piece-chopper-1.png", + "title": "Chopper from One Piece" + }, + { + "id": "one-piece-chopper-2.png", + "title": "Chopper from One Piece" + }, + { + "id": "one-piece-sanji-3.png", + "title": "Sanji from One Piece" + }, + { + "id": "one-piece-sanji-2.png", + "title": "Sanji from One Piece" + }, + { + "id": "one-piece-usopp-2.png", + "title": "Usopp from One PIece" + }, + { + "id": "one-piece-franky-1.png", + "title": "Franky from One Piece" + }, + { + "id": "one-piece-franky-2.png", + "title": "Franky from One Piece" + }, + { + "id": "one-piece-nico-robin-2.png", + "title": "Nico Robin from One Piece" + }, + { + "id": "one-piece-nico-robin-3.png", + "title": "Nico Robin from One Piece" + }, + { + "id": "one-piece-jimbei-4.png", + "title": "Jimbei from One Piece" + }, + { + "id": "one-piece-jimbei-2.png", + "title": "Jimbei from One Piece" + }, + { + "id": "one-piece-jimbei-1.png", + "title": "Jimbei from One Piece" + } + ] + }, + { + "title": "One Piece: Gear Five", + "assets": [ + { + "id": "gear5avatar1.png", + "title": "Luffy’s Peak – Attained! Gear Five" + }, + { + "id": "gear5avatar2.png", + "title": "Luffy’s Peak – Attained! Gear Five" + }, + { + "id": "gear5avatar3.png", + "title": "Luffy’s Peak – Attained! Gear Five" + }, + { + "id": "gear5avatar4.png", + "title": "Luffy’s Peak – Attained! Gear Five" + }, + { + "id": "gear5avatar5.png", + "title": "Luffy’s Peak – Attained! Gear Five" + }, + { + "id": "gear5avatar6.png", + "title": "Luffy’s Peak – Attained! Gear Five" + }, + { + "id": "gear5avatar7.png", + "title": "Luffy’s Peak – Attained! Gear Five" + }, + { + "id": "gear5avatar8.png", + "title": "Luffy’s Peak – Attained! Gear Five" + }, + { + "id": "gear5avatar9.png", + "title": "Luffy’s Peak – Attained! Gear Five" + } + ] + }, + { + "title": "Solo Leveling", + "assets": [ + { + "id": "solo_sungjinwoo.png", + "title": "Solo Leveling" + }, + { + "id": "solo_chahaein.png", + "title": "Solo Leveling" + }, + { + "id": "solo_yoojinho.png", + "title": "Solo Leveling" + }, + { + "id": "solo_choijongin.png", + "title": "Solo Leveling" + }, + { + "id": "solo_woojinchul.png", + "title": "Solo Leveling" + }, + { + "id": "solo_gogunhee.png", + "title": "Solo Leveling" + }, + { + "id": "solo_baekyoonho.png", + "title": "Solo Leveling" + }, + { + "id": "solo_teaser_visual.png", + "title": "Solo Leveling" + } + ] + }, + { + "title": "JUJUTSU KAISEN", + "assets": [ + { + "id": "1041-jujutsu-kaisen-yuji-itadori.png", + "title": "1041-jujutsu-kaisen-yuji-itadori.png" + }, + { + "id": "1042-jujutsu-kaisen-megumi-fushigoro.png", + "title": "1042-jujutsu-kaisen-megumi-fushigoro.png" + }, + { + "id": "1043-jujutsu-kaisen-nobara-kugisaki.png", + "title": "1043-jujutsu-kaisen-nobara-kugisaki.png" + }, + { + "id": "1044-jujutsu-kaisen-satoru-gojo.png", + "title": "1044-jujutsu-kaisen-satoru-gojo.png" + }, + { + "id": "1045-jujutsu-kaisen-ryomen-sukuna.png", + "title": "1045-jujutsu-kaisen-ryomen-sukuna.png" + } + ] + }, + { + "title": "Frieren: Beyond Journey's End", + "assets": [ + { + "id": "freiren-avatar-1.png", + "title": "Frieren: Beyond Journey's End" + }, + { + "id": "freiren-avatar-2.png", + "title": "Frieren: Beyond Journey's End" + }, + { + "id": "freiren-avatar-3.png", + "title": "Frieren: Beyond Journey's End" + }, + { + "id": "frieren_fern-avatar-1.png", + "title": "Frieren: Beyond Journey's End" + }, + { + "id": "frieren_fern-avatar-2.png", + "title": "Frieren: Beyond Journey's End" + }, + { + "id": "frieren_stark-avatar-1.png", + "title": "Frieren: Beyond Journey's End" + }, + { + "id": "frieren_stark-avatar-2.png", + "title": "Frieren: Beyond Journey's End" + }, + { + "id": "frieren_himmel-avatar-1.png", + "title": "Frieren: Beyond Journey's End" + }, + { + "id": "frieren_himmel-avatar-2.png", + "title": "Frieren: Beyond Journey's End" + }, + { + "id": "frieren_heiter-avatar-1.png", + "title": "Frieren: Beyond Journey's End" + }, + { + "id": "frieren_heiter-avatar-2.png", + "title": "Frieren: Beyond Journey's End" + }, + { + "id": "frieren_eisen-avatar-1.png", + "title": "Frieren: Beyond Journey's End" + }, + { + "id": "frieren_eisen-avatar-2.png", + "title": "Frieren: Beyond Journey's End" + } + ] + }, + { + "title": "Attack on Titan", + "assets": [ + { + "id": "aot_fc_eren-avatar.png", + "title": "Attack on Titan" + }, + { + "id": "aot_fc_mikasa-avatar.png", + "title": "Attack on Titan" + }, + { + "id": "aot_fc_armin-avatar.png", + "title": "Attack on Titan" + }, + { + "id": "aot_fc_levi-avatar.png", + "title": "Attack on Titan" + }, + { + "id": "aot_fc_reiner-avatar.png", + "title": "Attack on Titan" + }, + { + "id": "aot_fc_annie-avatar.png", + "title": "Attack on Titan" + }, + { + "id": "aot_fc_jean-avatar.png", + "title": "Attack on Titan" + }, + { + "id": "aot_fc_conny-avatar.png", + "title": "Attack on Titan" + }, + { + "id": "aot_fc_hange-avatar.png", + "title": "Attack on Titan" + }, + { + "id": "aot_fc_sasha-avatar.png", + "title": "Attack on Titan" + } + ] + }, + { + "title": "Mushoku Tensei: Jobless Reincarnation", + "assets": [ + { + "id": "mushokutensei_rudeus-school-uniform.png", + "title": "Rudeus - School Uniform from Mushoku Tensei: Jobless Reincarnation" + }, + { + "id": "mushokutensei_sylphie-fitz.png", + "title": "Sylphie from Mushoku Tensei" + }, + { + "id": "mushokutensei_sara.png", + "title": "Mushoku Tensei: Sara" + }, + { + "id": "mushokutensei_juli.png", + "title": "Juli from Mushoku Tensei: Jobless Reincarnation" + }, + { + "id": "mushokutensei_cliff.png", + "title": "Cliff from Mushoku Tensei: Jobless Reincarnation" + }, + { + "id": "mushokutensei_ariel.png", + "title": "Ariel from Mushoku Tensei: Jobless Reincarnation" + }, + { + "id": "mushokutensei_elinalise.png", + "title": "Elinalise from Mushoku Tensei: Jobless Reincarnation" + }, + { + "id": "mushokutensei_eris.png", + "title": "Eris from Mushoku Tensei: Jobless Reincarnation" + }, + { + "id": "mushokutensei_ghislaine.png", + "title": "Ghislaine from Mushoku Tensei: Jobless Reincarnation" + }, + { + "id": "mushokutensei_linia.png", + "title": "Linia from Mushoku Tensei: Jobless Reincarnation" + }, + { + "id": "mushokutensei_luke.png", + "title": "Luke from Mushoku Tensei: Jobless Reincarnation" + }, + { + "id": "mushokutensei_pursena.png", + "title": "Pursena from Mushoku Tensei: Jobless Reincarnation" + }, + { + "id": "mushokutensei_rudeus.png", + "title": "Rudeus from Mushoku Tensei: Jobless Reincarnation" + }, + { + "id": "mushokutensei_ruijerd.png", + "title": "Ruijerd from Mushoku Tensei: Jobless Reincarnation" + }, + { + "id": "mushokutensei_soldat.png", + "title": "Soldat from Mushoku Tensei" + }, + { + "id": "mushokutensei_suzanne.png", + "title": "Suzanne from MushokuTensei" + }, + { + "id": "mushokutensei_sylphie.png", + "title": "Sylphie from Mushoku Tensei" + }, + { + "id": "mushokutensei_zanoba.png", + "title": "Zanoba from Mushoku Tensei" + } + ] + }, + { + "title": "SPY x FAMILY", + "assets": [ + { + "id": "100006-spy-x-family-loid.png", + "title": "100006-spy-x-family-loid.png" + }, + { + "id": "100007-spy-x-family-yor.png", + "title": "100007-spy-x-family-yor.png" + }, + { + "id": "100008-spy-x-family-anya-1.png", + "title": "100008-spy-x-family-anya-1.png" + }, + { + "id": "100009-spy-x-family-anya-2.png", + "title": "100009-spy-x-family-anya-2.png" + }, + { + "id": "100010-spy-x-family-anya-3.png", + "title": "100010-spy-x-family-anya-3.png" + } + ] + }, + { + "title": "Chainsaw Man", + "assets": [ + { + "id": "chainsawman-denji.png", + "title": "Avatar of Denji from Chainsaw Man" + }, + { + "id": "chainsawman-aki.png", + "title": "Avatar of Aki from Chainsaw Man holding a sword" + }, + { + "id": "chainsawman-power.png", + "title": "Avatar of Power from Chainsaw Man" + }, + { + "id": "chainsawman-makima.png", + "title": "Avatar of Makima from Chainsaw Man" + }, + { + "id": "chainsawman-pochita.png", + "title": "Avatar of Pochita from Chainsaw Man" + }, + { + "id": "chainsawman-chainsawman.png", + "title": "Avatar of Chainsaw Man from Chainsaw Man" + }, + { + "id": "chainsawman-kobeni.png", + "title": "Avatar of Kobeni from Chainsaw Man holding up two peace signs" + }, + { + "id": "chainsawman-himeno.png", + "title": "Avatar of Himeno from Chainsaw Man" + }, + { + "id": "chainsawman-kishibe.png", + "title": "Avatar of Kishibe from Chainsaw Man" + } + ] + }, + { + "title": "BOCCHI THE ROCK!", + "assets": [ + { + "id": "bocchi-avatar.png", + "title": "BOCCHI THE ROCK!" + }, + { + "id": "bocchi-kv-avatar.png", + "title": "BOCCHI THE ROCK!" + }, + { + "id": "bochhi-nijika-avatar.png", + "title": "BOCCHI THE ROCK!" + }, + { + "id": "bocchi-nijika-kv-avatar.png", + "title": "BOCCHI THE ROCK!" + }, + { + "id": "bocchi-ryo-avatar.png", + "title": "BOCCHI THE ROCK!" + }, + { + "id": "bocchi-ryo-kv-avatar.png", + "title": "BOCCHI THE ROCK!" + }, + { + "id": "bocchi-kita-avatar.png", + "title": "BOCCHI THE ROCK!" + }, + { + "id": "bocchi-iita-kv-avatar.png", + "title": "BOCCHI THE ROCK!" + } + ] + }, + { + "title": "The Apothecary Diaries", + "assets": [ + { + "id": "apothecary_maomao-1.png", + "title": "The Apothecary Diaries" + }, + { + "id": "apothecary_maomao-2.png", + "title": "The Apothecary Diaries" + }, + { + "id": "apothecary_jinshi-1.png", + "title": "The Apothecary Diaries" + }, + { + "id": "apothecary_jinshi-2.png", + "title": "The Apothecary Diaries" + }, + { + "id": "apothecary_gyokuyou.png", + "title": "The Apothecary Diaries" + }, + { + "id": "apothecary_xiaolan.png", + "title": "The Apothecary Diaries" + }, + { + "id": "apothecary_gaoshun.png", + "title": "The Apothecary Diaries" + }, + { + "id": "apothecary_lihaku.png", + "title": "The Apothecary Diaries" + } + ] + }, + { + "title": "HIGH CARD", + "assets": [ + { + "id": "finn-1.png", + "title": "HIGH CARD" + }, + { + "id": "chris-1.png", + "title": "HIGH CARD" + }, + { + "id": "leo-1.png", + "title": "HIGH CARD" + }, + { + "id": "wendy-1.png", + "title": "HIGH CARD" + }, + { + "id": "vijay-1.png", + "title": "HIGH CARD" + }, + { + "id": "finn-2.png", + "title": "HIGH CARD" + }, + { + "id": "chris-2.png", + "title": "HIGH CARD" + }, + { + "id": "leo-2.png", + "title": "HIGH CARD" + }, + { + "id": "wendy-2.png", + "title": "HIGH CARD" + }, + { + "id": "vijay-2.png", + "title": "HIGH CARD" + } + ] + }, + { + "title": "My Dress-Up Darling", + "assets": [ + { + "id": "my-dress-up-marin-1-avatar.png", + "title": "My Dress-Up Darling" + }, + { + "id": "my-dress-up-marin-2-avatar.png", + "title": "My Dress-Up Darling" + }, + { + "id": "my-dress-up-marin-normal-avatar.png", + "title": "My Dress-Up Darling" + }, + { + "id": "my-dress-up-marin-cosplay-avatar.png", + "title": "My Dress-Up Darling" + }, + { + "id": "my-dress-up-gojo-1-avatar.png", + "title": "My Dress-Up Darling" + }, + { + "id": "my-dress-up-gojo-2-avatar.png", + "title": "My Dress-Up Darling" + }, + { + "id": "my-dress-up-sajuna-1-avatar.png", + "title": "My Dress-Up Darling" + }, + { + "id": "my-dress-up-sajuna-2-avatar.png", + "title": "My Dress-Up Darling" + }, + { + "id": "my-dress-up-shinju-1-avatar.png", + "title": "My Dress-Up Darling" + }, + { + "id": "my-dress-up-shinju-2-avatar.png", + "title": "My Dress-Up Darling" + } + ] + }, + { + "title": "Metallic Rouge", + "assets": [ + { + "id": "rouge-1.png", + "title": "Metallic Rouge" + }, + { + "id": "rouge-2.png", + "title": "Metallic Rouge" + }, + { + "id": "rouge-3.png", + "title": "Metallic Rouge" + }, + { + "id": "rouge-4.png", + "title": "Metallic Rouge" + }, + { + "id": "naomi-1.png", + "title": "Metallic Rouge" + }, + { + "id": "naomi-2.png", + "title": "Metallic Rouge" + }, + { + "id": "gene-1.png", + "title": "Metallic Rouge" + }, + { + "id": "gene-2.png", + "title": "Metallic Rouge" + }, + { + "id": "giallon-1.png", + "title": "Metallic Rouge" + }, + { + "id": "giallon-2.png", + "title": "Metallic Rouge" + }, + { + "id": "sarah.png", + "title": "Metallic Rouge" + }, + { + "id": "jill.png", + "title": "Metallic Rouge" + }, + { + "id": "afdal.png", + "title": "Metallic Rouge" + }, + { + "id": "eden.png", + "title": "Metallic Rouge" + }, + { + "id": "ash.png", + "title": "Metallic Rouge" + }, + { + "id": "noid.png", + "title": "Metallic Rouge" + } + ] + }, + { + "title": "I'm in Love with the Villainess", + "assets": [ + { + "id": "im_in_love_rae-kv1.png", + "title": "I'm in Love with the Villainess" + }, + { + "id": "im_in_love_clarie-kv1.png", + "title": "I'm in Love with the Villainess" + }, + { + "id": "im_in_love_rae-kv2.png", + "title": "I'm in Love with the Villainess" + }, + { + "id": "im_in_love_clarie-kv2.png", + "title": "I'm in Love with the Villainess" + }, + { + "id": "im_in_love_rae.png", + "title": "I'm in Love with the Villainess" + }, + { + "id": "im_in_love_clarie.png", + "title": "I'm in Love with the Villainess" + }, + { + "id": "im_in_love_lene.png", + "title": "I'm in Love with the Villainess" + }, + { + "id": "im_in_love_misha.png", + "title": "I'm in Love with the Villainess" + }, + { + "id": "im_in_love_manaria.png", + "title": "I'm in Love with the Villainess" + } + ] + }, + { + "title": "Rent-a-Girlfriend", + "assets": [ + { + "id": "rent-a-gf-chizuru-s1-date-kv.png", + "title": "Rent-a-Girlfriend" + }, + { + "id": "rent-a-gf-chizuru-s2-date-kv.png", + "title": "Rent-a-Girlfriend" + }, + { + "id": "rent-a-gf-chizuru-s3-date-kv.png", + "title": "Rent-a-Girlfriend" + }, + { + "id": "rent-a-gf-mami-s1-date-kv.png", + "title": "Rent-a-Girlfriend" + }, + { + "id": "rent-a-gf-mami-s2-date-kv_2.png", + "title": "Rent-a-Girlfriend" + }, + { + "id": "rent-a-gf-mami-s3-date-kv_2.png", + "title": "Rent-a-Girlfriend" + }, + { + "id": "rent-a-gf-ruka-s1-date-kv.png", + "title": "Rent-a-Girlfriend" + }, + { + "id": "rent-a-gf-ruka-s2-date-kv.png", + "title": "Rent-a-Girlfriend" + }, + { + "id": "rent-a-gf-ruka-s3-date-kv.png", + "title": "Rent-a-Girlfriend" + }, + { + "id": "rent-a-gf-mami-s2-date-kv_1.png", + "title": "Rent-a-Girlfriend" + }, + { + "id": "rent-a-gf-mami-s3-date-kv_1.png", + "title": "Rent-a-Girlfriend" + }, + { + "id": "rent-a-gf-sumi-s1-date-kv.png", + "title": "Rent-a-Girlfriend" + }, + { + "id": "rent-a-gf-yaemori-s3-date-kv.png", + "title": "Rent-a-Girlfriend" + }, + { + "id": "rent-a-gf-yaemori-s3-main-kv.png", + "title": "Rent-a-Girlfriend" + }, + { + "id": "rent-a-gf-yaemori-s3-teaser-kv.png", + "title": "Rent-a-Girlfriend" + } + ] + }, + { + "title": "The Rising of the Shield Hero", + "assets": [ + { + "id": "100001-the-rising-of-the-shield-hero-naofumi.png", + "title": "100001-the-rising-of-the-shield-hero-naofumi.png" + }, + { + "id": "100002-the-rising-of-the-shield-hero-raphtalia.png", + "title": "100002-the-rising-of-the-shield-hero-raphtalia.png" + }, + { + "id": "100003-the-rising-of-the-shield-hero-filo.png", + "title": "100003-the-rising-of-the-shield-hero-filo.png" + }, + { + "id": "100004-the-rising-of-the-shield-hero-melty.png", + "title": "100004-the-rising-of-the-shield-hero-melty.png" + }, + { + "id": "100005-the-rising-of-the-shield-hero-rishia.png", + "title": "100005-the-rising-of-the-shield-hero-rishia.png" + } + ] + }, + { + "title": "Tokyo Revengers", + "assets": [ + { + "id": "1040-tokyo-revengers-baji.png", + "title": "1040-tokyo-revengers-baji.png" + }, + { + "id": "1039-tokyo-revengers-mitsuya.png", + "title": "1039-tokyo-revengers-mitsuya.png" + }, + { + "id": "1038-tokyo-revengers-draken.png", + "title": "1038-tokyo-revengers-draken.png" + }, + { + "id": "1037-tokyo-revengers-mikey.png", + "title": "1037-tokyo-revengers-mikey.png" + }, + { + "id": "1036-tokyo-revengers-takemichi.png", + "title": "1036-tokyo-revengers-takemichi.png" + } + ] + }, + { + "title": "Black Clover", + "assets": [ + { + "id": "1056-black-clover-asta.png", + "title": "1056-black-clover-asta.png" + }, + { + "id": "1057-black-clover-yuno.png", + "title": "1057-black-clover-yuno.png" + }, + { + "id": "1058-black-clover-noelle.png", + "title": "1058-black-clover-noelle.png" + }, + { + "id": "1059-black-clover-yami.png", + "title": "1059-black-clover-yami.png" + }, + { + "id": "1060-black-clover-nero.png", + "title": "1060-black-clover-nero.png" + } + ] + }, + { + "title": "That Time I Got Reincarnated as a Slime", + "assets": [ + { + "id": "40-that-time-i-got-reincarnated-as-a-slime-hinata.png", + "title": "40-that-time-i-got-reincarnated-as-a-slime-hinata.png" + }, + { + "id": "39-that-time-i-got-reincarnated-as-a-slime-rimuru-slime.png", + "title": "39-that-time-i-got-reincarnated-as-a-slime-rimuru-slime.png" + }, + { + "id": "38-that-time-i-got-reincarnated-as-a-slime-shion.png", + "title": "38-that-time-i-got-reincarnated-as-a-slime-shion.png" + }, + { + "id": "37-that-time-i-got-reincarnated-as-a-slime-shuna.png", + "title": "37-that-time-i-got-reincarnated-as-a-slime-shuna.png" + }, + { + "id": "36-that-time-i-got-reincarnated-as-a-slime-rimuru-human.png", + "title": "36-that-time-i-got-reincarnated-as-a-slime-rimuru-human.png" + } + ] + }, + { + "title": "Dr. STONE", + "assets": [ + { + "id": "1046-dr-stone-senku.png", + "title": "1046-dr-stone-senku.png" + }, + { + "id": "1047-dr-stone-suika.png", + "title": "1047-dr-stone-suika.png" + }, + { + "id": "1048-dr-stone-kohaku.png", + "title": "1048-dr-stone-kohaku.png" + }, + { + "id": "1049-dr-stone-chrome.png", + "title": "1049-dr-stone-chrome.png" + }, + { + "id": "1050-dr-stone-gen.png", + "title": "1050-dr-stone-gen.png" + } + ] + }, + { + "title": "The World's Finest Assassin Gets Reincarnated in Another World as an Aristocrat", + "assets": [ + { + "id": "1001-the-worlds-finest-assassin-lugh.png", + "title": "1001-the-worlds-finest-assassin-lugh.png" + }, + { + "id": "1002-the-worlds-finest-assassin-dia.png", + "title": "1002-the-worlds-finest-assassin-dia.png" + }, + { + "id": "1003-the-worlds-finest-assassin-tart.png", + "title": "1003-the-worlds-finest-assassin-tart.png" + }, + { + "id": "1004-the-worlds-finest-assassin-maha.png", + "title": "1004-the-worlds-finest-assassin-maha.png" + }, + { + "id": "1005-the-worlds-finest-assassin-assassin.png", + "title": "1005-the-worlds-finest-assassin-assassin.png" + } + ] + }, + { + "title": "So I'm a Spider, So What?", + "assets": [ + { + "id": "1051-so-im-a-spider-so-what-kumoko.png", + "title": "1051-so-im-a-spider-so-what-kumoko.png" + }, + { + "id": "1052-so-im-a-spider-so-what-shun.png", + "title": "1052-so-im-a-spider-so-what-shun.png" + }, + { + "id": "1053-so-im-a-spider-so-what-katia.png", + "title": "1053-so-im-a-spider-so-what-katia.png" + }, + { + "id": "1054-so-im-a-spider-so-what-sue.png", + "title": "1054-so-im-a-spider-so-what-sue.png" + }, + { + "id": "1055-so-im-a-spider-so-what-fei.png", + "title": "1055-so-im-a-spider-so-what-fei.png" + } + ] + }, + { + "title": "To Your Eternity", + "assets": [ + { + "id": "1021-to-your-eternity-fushi.png", + "title": "1021-to-your-eternity-fushi.png" + }, + { + "id": "1022-to-your-eternity-joann.png", + "title": "1022-to-your-eternity-joann.png" + }, + { + "id": "1023-to-your-eternity-march.png", + "title": "1023-to-your-eternity-march.png" + }, + { + "id": "1024-to-your-eternity-parona.png", + "title": "1024-to-your-eternity-parona.png" + }, + { + "id": "1025-to-your-eternity-thebeholder.png", + "title": "1025-to-your-eternity-thebeholder.png" + }, + { + "id": "1026-to-your-eternity-gugu.png", + "title": "1026-to-your-eternity-gugu.png" + }, + { + "id": "1027-to-your-eternity-tonari.png", + "title": "1027-to-your-eternity-tonari.png" + }, + { + "id": "1028-to-your-eternity-theboy.png", + "title": "1028-to-your-eternity-theboy.png" + }, + { + "id": "1029-to-your-eternity-fushi.png", + "title": "1029-to-your-eternity-fushi.png" + }, + { + "id": "1030-to-your-eternity-march.png", + "title": "1030-to-your-eternity-march.png" + } + ] + }, + { + "title": "ZOMBIE LAND SAGA", + "assets": [ + { + "id": "46-zombieland-saga-revenge-lily-hoshikawa.png", + "title": "46-zombieland-saga-revenge-lily-hoshikawa.png" + }, + { + "id": "45-zombieland-saga-revenge-yugiri.png", + "title": "45-zombieland-saga-revenge-yugiri.png" + }, + { + "id": "47-zombieland-saga-revenge-tae-yamada.png", + "title": "47-zombieland-saga-revenge-tae-yamada.png" + }, + { + "id": "44-zombieland-saga-revenge-junko-konno.png", + "title": "44-zombieland-saga-revenge-junko-konno.png" + }, + { + "id": "43-zombieland-saga-revenge-ai-mizuno.png", + "title": "43-zombieland-saga-revenge-ai-mizuno.png" + }, + { + "id": "42-zombieland-saga-revenge-saki-nikaido.png", + "title": "42-zombieland-saga-revenge-saki-nikaido.png" + }, + { + "id": "41-zombieland-saga-revenge-sakura-minamoto.png", + "title": "41-zombieland-saga-revenge-sakura-minamoto.png" + } + ] + }, + { + "title": "Somali and the Forest Spirit", + "assets": [ + { + "id": "35-somali-and-the-forest-spirit-kikila.jpg", + "title": "35-somali-and-the-forest-spirit-kikila.jpg" + }, + { + "id": "34-somali-and-the-forest-spirit-uzoi.jpg", + "title": "34-somali-and-the-forest-spirit-uzoi.jpg" + }, + { + "id": "33-somali-and-the-forest-spirit-shizuno.jpg", + "title": "33-somali-and-the-forest-spirit-shizuno.jpg" + }, + { + "id": "32-somali-and-the-forest-spirit-somali.jpg", + "title": "32-somali-and-the-forest-spirit-somali.jpg" + }, + { + "id": "31-somali-and-the-forest-spirit-golem.jpg", + "title": "31-somali-and-the-forest-spirit-golem.jpg" + } + ] + }, + { + "title": "In/Spectre", + "assets": [ + { + "id": "30-inspectre-komainu.png", + "title": "30-inspectre-komainu.png" + }, + { + "id": "29-inspectre-steel-lady-nanase.png", + "title": "29-inspectre-steel-lady-nanase.png" + }, + { + "id": "28-inspectre-saki-yumihara.png", + "title": "28-inspectre-saki-yumihara.png" + }, + { + "id": "27-inspectre-kuro-sakuragawa.png", + "title": "27-inspectre-kuro-sakuragawa.png" + }, + { + "id": "26-inspectre-kotoko-iwanaga.png", + "title": "26-inspectre-kotoko-iwanaga.png" + } + ] + }, + { + "title": "The God of High School", + "assets": [ + { + "id": "20-the-god-of-high-school-park-ilpyo.png", + "title": "20-the-god-of-high-school-park-ilpyo.png" + }, + { + "id": "19-the-god-of-high-school-park-mujin.png", + "title": "19-the-god-of-high-school-park-mujin.png" + }, + { + "id": "18-the-god-of-high-school-yoo-mira.png", + "title": "18-the-god-of-high-school-yoo-mira.png" + }, + { + "id": "17-the-god-of-high-school-han-daewi.png", + "title": "17-the-god-of-high-school-han-daewi.png" + }, + { + "id": "16-the-god-of-high-school-jin-mori.png", + "title": "16-the-god-of-high-school-jin-mori.png" + } + ] + }, + { + "title": "Tower of God", + "assets": [ + { + "id": "15-tower-of-god-endorsi-jahad.png", + "title": "15-tower-of-god-endorsi-jahad.png" + }, + { + "id": "14-tower-of-god-yuri-jahad.png", + "title": "14-tower-of-god-yuri-jahad.png" + }, + { + "id": "13-tower-of-god-rak.png", + "title": "13-tower-of-god-rak.png" + }, + { + "id": "11-tower-of-god-bam.png", + "title": "11-tower-of-god-bam.png" + }, + { + "id": "12-tower-of-god-khun.png", + "title": "12-tower-of-god-khun.png" + } + ] + }, + { + "title": "Fena: Pirate Princess", + "assets": [ + { + "id": "1011-fena-pirate-princess-fena.png", + "title": "1011-fena-pirate-princess-fena.png" + }, + { + "id": "1013-fena-pirate-princess-shitan.png", + "title": "1013-fena-pirate-princess-shitan.png" + }, + { + "id": "1012-fena-pirate-princess-yukimaru.png", + "title": "1012-fena-pirate-princess-yukimaru.png" + }, + { + "id": "1014-fena-pirate-princess-karin.png", + "title": "1014-fena-pirate-princess-karin.png" + }, + { + "id": "1015-fena-pirate-princess-twins.png", + "title": "1015-fena-pirate-princess-twins.png" + }, + { + "id": "1016-fena-pirate-princess-makaba.png", + "title": "1016-fena-pirate-princess-makaba.png" + }, + { + "id": "1017-fena-pirate-princess-tsubaki.png", + "title": "1017-fena-pirate-princess-tsubaki.png" + }, + { + "id": "1019-fena-pirate-princess-fena-young.png", + "title": "1019-fena-pirate-princess-fena-young.png" + }, + { + "id": "1018-fena-pirate-princess-brule.png", + "title": "1018-fena-pirate-princess-brule.png" + }, + { + "id": "1020-fena-pirate-princess-yukimaru-young.png", + "title": "1020-fena-pirate-princess-yukimaru-young.png" + } + ] + }, + { + "title": "Bananya", + "assets": [ + { + "id": "25-bananya-emo.png", + "title": "25-bananya-emo.png" + }, + { + "id": "24-bananya-night-rainbow.png", + "title": "24-bananya-night-rainbow.png" + }, + { + "id": "23-bananya-pirate.png", + "title": "23-bananya-pirate.png" + }, + { + "id": "22-bananya-droopy-eared.png", + "title": "22-bananya-droopy-eared.png" + }, + { + "id": "21-bananya-bananya.png", + "title": "21-bananya-bananya.png" + } + ] + }, + { + "title": "Mitrasphere", + "assets": [ + { + "id": "1006-mitrasphere-hime.png", + "title": "1006-mitrasphere-hime.png" + }, + { + "id": "1007-mitrasphere-yuzu.png", + "title": "1007-mitrasphere-yuzu.png" + }, + { + "id": "1008-mitrasphere-matilda.png", + "title": "1008-mitrasphere-matilda.png" + }, + { + "id": "1009-mitrasphere-hildegard.png", + "title": "1009-mitrasphere-hildegard.png" + }, + { + "id": "1010-mitrasphere-upa.png", + "title": "1010-mitrasphere-upa.png" + } + ] + } + ] +} \ No newline at end of file diff --git a/profiles/dynamic.py b/profiles/dynamic.py new file mode 100644 index 0000000..a26d8d7 --- /dev/null +++ b/profiles/dynamic.py @@ -0,0 +1,105 @@ +import secrets +import random + +import requests + +from requests_toolbelt.multipart.encoder import MultipartEncoder + + +def fields(value: dict) -> dict: + return {key: str(val) for key, val in value.items()} + + +def get_id() -> str: + group1 = '-'.join([f'{random.randint(0, 255):02x}' for _ in range(6)]) + group2 = '-'.join([f'{random.randint(0, 255):02x}' for _ in range(6)]) + return f'{group1}:{group2}' + + +if __name__ == '__main__': + user_email = 'example@mail.com' + user_token = secrets.token_hex(16) + user_subscription = 'register' + device_token = secrets.token_hex(16) + device_platform = 49 + device_id = get_id() + app_version = 6169 + media_id = 'B0CPPH5WK4' + pssh = 'CAESEM235gyo/kFAk//K99EUxOAaBmFtYXpvbiI1Y2lkOnpiZm1ES2orUVVDVC84cjMwUlRFNEE9PSxRWVJUWXJnd1JxbXBzMngvTnM0alVRPT0qAlNEMgA=' + certificate = 'CAUSwgUKvAIIAxIQCuQRtZRasVgFt7DIvVtVHBi17OSpBSKOAjCCAQoCggEBAKU2UrYVOSDlcXajWhpEgGhqGraJtFdUPgu6plJGy9ViaRn5mhyXON5PXmw1krQdi0SLxf00FfIgnYFLpDfvNeItGn9rcx0RNPwP39PW7aW0Fbqi6VCaKWlR24kRpd7NQ4woyMXr7xlBWPwPNxK4xmR/6UuvKyYWEkroyeIjWHAqgCjCmpfIpVcPsyrnMuPFGl82MMVnAhTweTKnEPOqJpxQ1bdQvVNCvkba5gjOTbEnJ7aXegwhmCdRQzXjTeEV2dO8oo5YfxW6pRBovzF6wYBMQYpSCJIA24ptAP/2TkneyJuqm4hJNFvtF8fsBgTQQ4TIhnX4bZ9imuhivYLa6HsCAwEAAToPYW1hem9uLmNvbS1wcm9kEoADETQD6R0H/h9fyg0Hw7mj0M7T4s0bcBf4fMhARpwk2X4HpvB49bJ5Yvc4t41mAnXGe/wiXbzsddKMiMffkSE1QWK1CFPBgziU23y1PjQToGiIv/sJIFRKRJ4qMBxIl95xlvSEzKdt68n7wqGa442+uAgk7CXU3uTfVofYY76CrPBnEKQfad/CVqTh48geNTb4qRH1TX30NzCsB9NWlcdvg10pCnWSm8cSHu1d9yH+2yQgsGe52QoHHCqHNzG/wAxMYWTevXQW7EPTBeFySPY0xUN+2F2FhCf5/A7uFUHywd0zNTswh0QJc93LBTh46clRLO+d4RKBiBSj3rah6Y5iXMw9N9o58tCRc9gFHrjfMNubopWHjDOO3ATUgqXrTp+fKVCmsGuGl1ComHxXV9i1AqHwzzY2JY2vFqo73jR3IElr6oChPIwcNokmNc0D4TXtjE0BoYkbWKJfHvJJihzMOvDicWUsemVHvua9/FBtpbHgpbgwijFPjtQF9Ldb8Swf' + + multipart_data = MultipartEncoder( + fields({ + 'T': 10, + 'B': 6, + 'C': user_email, + 'D': user_token, + 'E': user_subscription, + 'F': device_token, + 'G': device_platform, + 'H': device_id, + 'I': 1, + 'Z': app_version, + 'K': 2, + 'L': media_id, + 'M': pssh, + 'N': certificate + }) + ) + + # @Info: Challenge + r = requests.request( + method='POST', + url='https://drm-w-j2.dvdfab.cn/ex/', + data=multipart_data, + headers={ + 'Accept': '*/*', + 'Content-Type': multipart_data.content_type, + 'Expect': '100-continue', + 'User-Agent': 'DVDFab' + } + ) + r.raise_for_status() + + challenge = r.json()['FB'] + print(f'[+] Challenge: {challenge}') + + licence = '' # TODO: AMZ License + + # @Info: Keys + multipart_data = MultipartEncoder( + fields({ + 'T': 12, + 'B': 6, + 'C': email, + 'D': user_token, + 'E': user_subscription, + 'F': device_token, + 'G': device_platform, + 'H': device_id, + 'I': 1, + 'Z': app_version, + 'K': 2, + 'L': media_id, + 'M': pssh, + 'N': certificate, + 'O': licence + }) + ) + + r = requests.request( + method='POST', + url='https://drm-w-j2.dvdfab.cn/ex/', + data=multipart_data, + headers={ + 'Accept': '*/*', + 'Content-Type': multipart_data.content_type, + 'Expect': '100-continue', + 'User-Agent': 'DVDFab' + } + ) + r.raise_for_status() + content = r.json() + + data = content['D'] + mod_key = content['T'] diff --git a/profiles/intercept.py b/profiles/intercept.py new file mode 100644 index 0000000..28d4069 --- /dev/null +++ b/profiles/intercept.py @@ -0,0 +1,146 @@ +# scans PID for utf-8 string with option to stop on first occurence +# adjusted code taken from Awesometech here https://python-forum.io/thread-5517.html + +import ctypes +from ctypes.wintypes import WORD, DWORD, LPVOID +import psutil +import sys, os + + +class SYSTEM_INFO(ctypes.Structure): + """https://msdn.microsoft.com/en-us/library/ms724958""" + + class _U(ctypes.Union): + class _S(ctypes.Structure): + _fields_ = (('wProcessorArchitecture', WORD), + ('wReserved', WORD)) + + _fields_ = (('dwOemId', DWORD), # obsolete + ('_s', _S)) + _anonymous_ = ('_s',) + + if ctypes.sizeof(ctypes.c_void_p) == ctypes.sizeof(ctypes.c_ulonglong): + DWORD_PTR = ctypes.c_ulonglong + elif ctypes.sizeof(ctypes.c_void_p) == ctypes.sizeof(ctypes.c_ulong): + DWORD_PTR = ctypes.c_ulong + + _fields_ = (('_u', _U), + ('dwPageSize', DWORD), + ('lpMinimumApplicationAddress', LPVOID), + ('lpMaximumApplicationAddress', LPVOID), + ('dwActiveProcessorMask', DWORD_PTR), + ('dwNumberOfProcessors', DWORD), + ('dwProcessorType', DWORD), + ('dwAllocationGranularity', DWORD), + ('wProcessorLevel', WORD), + ('wProcessorRevision', WORD)) + _anonymous_ = ('_u',) + + +class MEMORY_BASIC_INFORMATION(ctypes.Structure): + """https://msdn.microsoft.com/en-us/library/aa366775""" + PVOID = LPVOID + SIZE_T = ctypes.c_size_t + _fields_ = (('BaseAddress', PVOID), + ('AllocationBase', PVOID), + ('AllocationProtect', DWORD), + ('RegionSize', SIZE_T), + ('State', DWORD), + ('Protect', DWORD), + ('Type', DWORD)) + + +def main(PID=os.getpid(), FIND_STR='ąsdf1234', _exit_on_first_match=True): + findstr = bytearray(FIND_STR.encode('utf-8')) + + print(f'\n*** Searching {FIND_STR} in PID {PID} _exit_on_first_match {_exit_on_first_match}\n') + + LPSYSTEM_INFO = ctypes.POINTER( + SYSTEM_INFO) ##PMEMORY_BASIC_INFORMATION = ctypes.POINTER(MEMORY_BASIC_INFORMATION) + + Kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) + Kernel32.GetSystemInfo.restype = None + Kernel32.GetSystemInfo.argtypes = (LPSYSTEM_INFO,) + ReadProcessMemory = Kernel32.ReadProcessMemory + + sysinfo = SYSTEM_INFO() + Kernel32.GetSystemInfo(ctypes.byref(sysinfo)) + start_addr = sysinfo.lpMinimumApplicationAddress + current_address = sysinfo.lpMinimumApplicationAddress + end_address = sysinfo.lpMaximumApplicationAddress + + PROCESS_QUERY_INFORMATION = 0x0400 + PROCESS_VM_READ = 0x0010 + MEM_COMMIT = 0x00001000; + PAGE_READWRITE = 0x04; + + Process = Kernel32.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, False, + PID) # print('process:', Process) + + mbi = MEMORY_BASIC_INFORMATION() + + buffer = ctypes.c_char() # c_double() ##buffer = ctypes.c_uint() + nread = ctypes.c_size_t() # SIZE_T() + + # start = ctypes.c_void_p(mbi.BaseAddress) + + ci = 0 + count_occur = 0 + while current_address < end_address: + current_address_ctypes = ctypes.c_void_p(current_address) + _k = Kernel32.VirtualQueryEx(Process, current_address_ctypes, ctypes.byref(mbi), + ctypes.sizeof(mbi)) # read cur region to mbi + if mbi.Protect == PAGE_READWRITE and mbi.State == MEM_COMMIT: # print('This region can be scanned!',index,end, end-index) + index = current_address + end = current_address + mbi.RegionSize + + ci = 0 + vi = [] + f_ind = -1 + while index < end: # index -> ctypes.c_void_p(index) ? + rm = ReadProcessMemory(Process, ctypes.c_void_p(index), ctypes.byref(buffer), ctypes.sizeof(buffer), + ctypes.byref(nread)) # read cur region bytes to bugger + # print('rm',rm) + if rm > 0: + _x = findstr[ci].to_bytes(1, 'little') + if buffer.value == _x: + if ci == 0: f_ind = index + vi.append(buffer.value) + ci += 1 + if ci == len(findstr): + count_occur += 1 + print( + f'MATCHED [{count_occur}] STRING between indexes {f_ind} and {index}') # , ,, b''.join(vi).decode('utf-8')) + if _exit_on_first_match: + # current_address = end_address + print('\texiting on _exit_on_first_match', _exit_on_first_match) + return + + else: + ci, f_ind, vi = 0, -1, [] + else: + ci, f_ind, vi = 0, -1, [] + else: + ci, f_ind, vi = 0, -1, [] + + index += ctypes.sizeof(buffer) + + print( + f"\tProgress done {current_address - start_addr} {round(100 * (current_address - start_addr) / (end_address - start_addr))}%, left {end_address - current_address}, this iter did {mbi.RegionSize}") # {round(100*(end_address-current_address)/(end_address-start_addr))} + + current_address += mbi.RegionSize + +# https://medium.com/@algolithics/scanning-windows-memory-with-python-memory-string-detection-6b80e1dac1d0 +# arg1: pid, arg2=search string unicode , arg3=True/False if exit on first match +if __name__ == '__main__': + + if len(sys.argv) == 3: + main(int(sys.argv[1]), sys.argv[2]) + elif len(sys.argv) == 4: + main(int(sys.argv[1]), sys.argv[2], sys.argv[3].lower() == 'true') + else: + print('\n=== To customize provide arguments: PID UTF8_STRING_TO_SEARCH EXIT_ON_FIRST_MATCH=True/False') + print('=== Arguments example: 1234 sometext False\n') + main() + + print('\n*** Finished scanning memory\n') diff --git a/profiles/main.py b/profiles/main.py new file mode 100644 index 0000000..89357cb --- /dev/null +++ b/profiles/main.py @@ -0,0 +1,33 @@ +import json +import re +from pathlib import Path + +import requests + +PARENT = Path() + + +def sanitize(value: str) -> str: + return re.sub(r'[<>:"/\\|?*]', '_', value) + + +if __name__ == '__main__': + avatar = json.loads((PARENT / 'avatar.json').read_bytes()) + for item in avatar['items']: + path = PARENT / 'Avatar' / sanitize(item['title']) + path.mkdir(parents=True, exist_ok=True) + for asset in item['assets']: + url = 'https://static.crunchyroll.com/assets/avatar/170x170/' + asset['id'] + r = requests.request( + method='GET', + url=url, + headers={ + 'Accept': '*/*', + 'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 10; Mi A2 Build/QKQ1.190910.002)' + } + ) + r.raise_for_status() + + file = path / sanitize(asset['id']) + file.write_bytes(r.content) + print(file) diff --git a/profiles/static.py b/profiles/static.py new file mode 100644 index 0000000..36e579d --- /dev/null +++ b/profiles/static.py @@ -0,0 +1,68 @@ +import secrets +import random +from datetime import datetime + +import requests + +from requests_toolbelt.multipart.encoder import MultipartEncoder + + +def fields(value: dict) -> dict: + return {key: str(val) for key, val in value.items()} + + +def get_id() -> str: + group1 = '-'.join([f'{random.randint(0, 255):02x}' for _ in range(6)]) + group2 = '-'.join([f'{random.randint(0, 255):02x}' for _ in range(6)]) + return f'{group1}:{group2}' + + +if __name__ == '__main__': + database_table = 20 # Amazon + device_token = secrets.token_hex(16) + media_key_id = 'ac397b17ffaf4787af545de3035ca77c' + device_id = get_id() + user_email = 'example@mail.com' + user_token = secrets.token_hex(16) + device_platform = 49 + app_version = 6169 + user_subscription = 'register' + media_id = 'B0CPPH5WK4' + date = datetime.now().strftime('%Y-%m-%d') + + multipart_data = MultipartEncoder( + fields({ + 'IV': 100, + 'CM': 103, + 'TB': database_table, + 'KD': media_key_id, + 'MD': device_id, + 'EM': user_email, + 'PW': user_token, + 'CD': device_platform, + 'AV': app_version, + 'RT': user_subscription, + 'PD': media_id, + 'WD': 2, + 'LT': date + }) + ) + + # @Info: Cached keys + r = requests.request( + method='POST', + url='https://drm-u1.dvdfab.cn/ak/uc/', + data=multipart_data, + headers={ + 'Accept': '*/*', + 'Content-Type': multipart_data.content_type, + 'Expect': '100-continue', + 'User-Agent': 'DVDFab' + } + ) + r.raise_for_status() + content = r.json() + + data = content['d'] + mod_key = content['k'] + unknown = content['u'] # TODO: ?? diff --git a/pycbzhelper/__init__.py b/pycbzhelper/__init__.py deleted file mode 100644 index f9a4a26..0000000 --- a/pycbzhelper/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from .helper import * -from .comicinfo import * -from .utils import slugify - -__version__ = "3.1.1" diff --git a/pycbzhelper/comicinfo.py b/pycbzhelper/comicinfo.py deleted file mode 100644 index dc19300..0000000 --- a/pycbzhelper/comicinfo.py +++ /dev/null @@ -1,37 +0,0 @@ -KEYS_STRING = [ - "Title", "Series", "Number", "AlternateSeries", "AlternateNumber", - "Summary", "Notes", "Writer", "Penciller", "Inker", "Colorist", - "Letterer", "CoverArtist", "Editor", "Publisher", "Imprint", "Genre", - "Web", "Characters", "Teams", "Locations", "ScanInformation", - "StoryArc", "SeriesGroup", "CommunityRating", "Tags", "Translator" -] - -KEYS_INT = [ - "Count", "Volume", "AlternateCount", "Year", "Month", "Day", "PageCount" -] - -KEYS_SPECIAL = [ - "BlackAndWhite", "Manga", "AgeRating", "Pages", "LanguageISO", "Format", "ESN" -] - -KEYS_AGE = [ - "Adults Only 18+", "Early Childhood", "Everyone", "Everyone 10+", - "G", "Kids to Adults", "M", "MA 15+", "Mature 17+", "PG", "R18+", - "Rating Pending", "Teen", "X18+", "Rating Pending" -] - -KEYS_FORMAT = [ - "1 Shot", "1/2", "1-Shot", "Annotation", "Annotations", - "Annual", "Anthology", "B&W", "B/W", "B&&W", "Black & White", "Box Set", - "Box-Set", "Crossover", "Director's Cut", "Epilogue", "Event", "FCBD", - "Flyer", "Giant", "Giant Size", "Giant-Size", "Graphic Novel", "Hardcover", - "Hard-Cover", "King", "King Size", "King-Size", "Limited Series", "Magazine", - "NSFW", "One Shot", "One-Shot", "Point 1", "Preview", "Prologue", "Reference", - "Review", "Reviewed", "Scanlation", "Script", "Series", "Sketch", "Special", - "TPB", "Trade Paper Back", "WebComic", "Web Comic", "Year 1", "Year One" -] - -KEYS_PAGE_TYPE = [ - "FrontCover", "InnerCover", "Roundup", "Story", "Advertisment", - "Editorial", "Letters", "Preview", "BackCover", "Other", "Deleted" -] diff --git a/pycbzhelper/exceptions.py b/pycbzhelper/exceptions.py deleted file mode 100644 index 9b4d434..0000000 --- a/pycbzhelper/exceptions.py +++ /dev/null @@ -1,18 +0,0 @@ -class PyCBZHelperException(Exception): - """Exceptions used by PyCBZHelper.""" - - -class InvalidKeyValue(PyCBZHelperException): - """The key value is invalid.""" - - -class MissingPageFile(PyCBZHelperException): - """No page available.""" - - -class InvalidFileExtension(PyCBZHelperException): - """Invalid file extension.""" - - -class FileNotFound(PyCBZHelperException): - """The specified source file was not found.""" diff --git a/pycbzhelper/helper.py b/pycbzhelper/helper.py deleted file mode 100644 index 47ab787..0000000 --- a/pycbzhelper/helper.py +++ /dev/null @@ -1,151 +0,0 @@ -import shutil -import zipfile - -import requests -from json2xml import json2xml -from langcodes import Language -from PIL import Image -from pathlib import Path - -from pycbzhelper.comicinfo import KEYS_STRING, KEYS_INT, KEYS_SPECIAL, KEYS_AGE, KEYS_FORMAT, KEYS_PAGE_TYPE -from pycbzhelper.exceptions import InvalidKeyValue, MissingPageFile, FileNotFound, InvalidFileExtension -from pycbzhelper.utils import get_key_value, delete_none - -TMP = Path.home().resolve() / ".cbzhelper" - - -class Helper: - - def __init__(self, kwargs): - self._pages = [] - self.comic_info = self._comic_info(kwargs) - - def _comic_info(self, kwargs) -> str: - for key in KEYS_STRING: - value = kwargs.get(key) - if value is not None and not isinstance(value, str): - raise InvalidKeyValue(f"Key must be string: {key}") - - for key in KEYS_INT: - value = kwargs.get(key) - if value is not None and not isinstance(value, int): - raise InvalidKeyValue(f"Key must be integer: {key}") - - for key in KEYS_SPECIAL: - value = kwargs.get(key) - if value is not None: - if key == "BlackAndWhite" and get_key_value(value) not in ["Yes", "No"]: - raise InvalidKeyValue(f"Key must be boolean: {key}") - elif key == "Manga" and get_key_value(value) not in ["YesAndRightToLeft", "Yes", "No"]: - raise InvalidKeyValue(f"Key must be boolean or special boolean: {key}") - elif key == "AgeRating" and value not in KEYS_AGE: - raise InvalidKeyValue(f"Key must be special age: {key}") - elif key == "LanguageISO" and not Language.get(value).is_valid(): - raise InvalidKeyValue(f"Key must be ISO language: {key}") - elif key == "Format" and value not in KEYS_FORMAT: - raise InvalidKeyValue(f"Key must be special format: {key}") - elif key == "Pages": - if isinstance(value, list): - for file in value: - page_file = file.get("File") - if isinstance(page_file, Path): - if not page_file.is_file(): - raise FileNotFound("File does not exist.") - elif isinstance(page_file, str): - if not page_file.startswith("http"): - raise InvalidKeyValue(f"Key must be an existing file path: {key}") - else: - raise InvalidKeyValue(f"Key must be an existing file path: {key}") - - page_type = file.get("Type") - if page_type and page_type not in KEYS_PAGE_TYPE: - raise InvalidKeyValue("Key must be special type: Type") - page_double = file.get("DoublePage") - if page_double and get_key_value(page_double) not in ["Yes", "No"]: - raise InvalidKeyValue("Key must be boolean: DoublePage") - else: - raise InvalidKeyValue(f"Key must be a list: {key}") - - xml_pages = [] - pages = kwargs.get("Pages") or [] - if len(pages) > 0: - # [{"File": "FILE_PATH", "Type": "FrontCover", "DoublePage": False, "Bookmark": "", "Key": ""}] - kwargs["PageCount"] = len(pages) - xml_pages.append(" ") - - for i, file in enumerate(pages): - page_file = file["File"] - if isinstance(page_file, str): - r = requests.get(page_file) - r.raise_for_status() - content = r.content - else: - content = page_file.read_bytes() - - page_file = TMP / f"page-{i:03d}.jpg" - page_file.parent.mkdir(parents=True, exist_ok=True) - page_file.write_bytes(content) - self._pages.append(page_file) - - properties = Image.open(page_file) - page_type = file.get("Type") or "FrontCover" if i == 0 else "Story" - - items = [" '.format( - double=str(page_double == "Yes"), - image=i, - height=properties.height, - size=len(properties.fp.read()), - width=properties.width, - type=page_type - )) - xml_pages.append(" ") - xml_pages.append("") - kwargs.pop("Pages", None) - - dict_data = {} - for key in KEYS_STRING + KEYS_INT + KEYS_SPECIAL: - dict_data[key] = get_key_value(kwargs.get(key)) - - xml_data = json2xml.Json2xml(delete_none(dict_data), wrapper="ComicInfo", pretty=True, attr_type=False, item_wrap=False).to_xml() - - if not xml_data: - xml_data = "\n".join(['', "", ""]) - print("WARNING: No metadata to create.") - xml_data = xml_data.replace('', '') - xml_data = xml_data.replace("", "\n".join(xml_pages)) - return xml_data.strip() - - def create_cbz(self, path: Path) -> None: - if not len(self._pages) > 0: - raise MissingPageFile("No pages available.") - if path.suffix != ".cbz": - raise InvalidFileExtension("Invalid file extension.") - - path.parent.mkdir(parents=True, exist_ok=True) - cbz = zipfile.ZipFile(path, "w", compression=zipfile.ZIP_STORED) - clear_path = [] - - for i, page in enumerate(self._pages): - clear_path.append(page) - cbz.writestr(f"page-{i + 1:03d}{page.suffix}", data=page.read_bytes()) - - cbz.writestr("ComicInfo.xml", data=self.comic_info.encode("utf-8")) - cbz.close() - - self._pages = [] - shutil.rmtree(TMP) diff --git a/pycbzhelper/utils.py b/pycbzhelper/utils.py deleted file mode 100644 index e592587..0000000 --- a/pycbzhelper/utils.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import annotations -from typing import Union - -import unicodedata - - -def get_key_value(value: Union[str, bool]) -> str: - if isinstance(value, bool): - return "Yes" if value else "No" - return value - - -def delete_none(_dict: dict) -> dict: - """Delete None values recursively from all of the dictionaries, tuples, lists, sets""" - if isinstance(_dict, dict): - for key, value in list(_dict.items()): - if isinstance(value, (list, dict, tuple, set)): - _dict[key] = delete_none(value) - elif value is None or key is None: - del _dict[key] - if value == {}: - del _dict[key] - - elif isinstance(_dict, (list, set, tuple)): - _dict = type(_dict)(delete_none(item) for item in _dict if item is not None) - return _dict - - -def slugify(value: Union[str, int], allow_unicode: bool = False) -> str: - """ - Taken from https://github.com/django/django/blob/master/django/utils/text.py - Convert to ASCII if 'allow_unicode' is False. Convert spaces or repeated - dashes to single dashes. Remove characters that aren't alphanumerics, - underscores, or hyphens. Convert to lowercase. Also strip leading and - trailing whitespace, dashes, and underscores. - """ - value = str(value) - if allow_unicode: - value = unicodedata.normalize("NFKC", value) - else: - value = unicodedata.normalize("NFKD", value).encode("ascii", "ignore").decode("ascii") - # value = re.sub(r'[^\w\s-]', '', value.lower()) - # return re.sub(r'[-\s]+', '-', value).strip('-_') - return value diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..5f1da7d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +requests~=2.31.0 +pywidevine~=1.6.0 \ No newline at end of file diff --git a/setup.py b/setup.py deleted file mode 100644 index 8e3c8b3..0000000 --- a/setup.py +++ /dev/null @@ -1,41 +0,0 @@ -from setuptools import setup, find_packages - -setup( - name="pycbzhelper", - version="3.1.2", - author="hyugogirubato", - author_email="hyugogirubato@gmail.com", - description="Python library for creating CBZ files with metadata.", - long_description=open("README.md").read(), - long_description_content_type="text/markdown", - url="https://github.com/hyugogirubato/pycbzhelper", - packages=find_packages(), - license="GPL-3.0-only", - keywords=[ - "metadata", - "manga", - "comics", - "ebooks", - "cbz" - ], - classifiers=[ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "Intended Audience :: End Users/Desktop", - "Natural Language :: English", - "Operating System :: OS Independent", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Topic :: Utilities" - ], - install_requires=[ - "requests", - "json2xml", - "langcodes", - "Pillow" - ], - python_requires=">=3.7" -) diff --git a/test/test.py b/test/test.py deleted file mode 100644 index dd1e55c..0000000 --- a/test/test.py +++ /dev/null @@ -1,42 +0,0 @@ -from pathlib import Path - -import pycbzhelper - -PARENT = Path(__file__).resolve().parent - -if __name__ == "__main__": - pages = [] - for i in range(11): - pages.append({"File": (PARENT / "images" / f"page-{i:03d}.jpg")}) - - metadata = { - "Title": "T1 - Arrête de me chauffer, Nagatoro", - "Series": "Arrête de me chauffer, Nagatoro", - "Number": "1", - "Count": 8, - "Volume": 1, - "Summary": "Nagatoro est en seconde. Pleine d\u2019assurance, joueuse, moqueuse, elle se d\u00e9couvre un jour un passe-temps favori : martyriser son \u201cSenpai\u201d, lyc\u00e9en de premi\u00e8re timide et mal dans sa peau. Nagatoro taquine, agace, aguiche, va parfois trop loin... mais qu\u2019a-t-elle vraiment derri\u00e8re la t\u00eate ? Et si derri\u00e8re ses moqueries elle cachait une v\u00e9ritable affection ? Et si finalement, ses farces permettaient \u00e0 Senpai de s\u2019affirmer ?", - "Year": 2021, - "Month": 3, - "Day": 12, - "Writer": "Nanashi", - "Inker": "Nanashi", - "Editor": "Noeve Grafx", - "Publisher": "Noeve Grafx", - "Imprint": "Noeve Grafx", - "Genre": "Shonen", - "Web": "http://www.izneo.com/en/manga/shonen/arrete-de-me-chauffer-nagatoro-37560/arrete-de-me-chauffer-nagatoro-86232", - "LanguageISO": "fr", - "Format": "Preview", - "BlackAndWhite": True, - "Manga": "YesAndRightToLeft", - "AgeRating": "Everyone 10+", - "CommunityRating": "5.0", - "ean": "9782490676569", - "Pages": pages - } - - path = PARENT / "eBooks" / "Arrête de me chauffer, Nagatoro.cbz" - helper = pycbzhelper.Helper(metadata) - helper.create_cbz(path=path) - print(f"I: File created: {path}")