Metadata-Version: 2.1
Name: anime_parsers_ru
Version: 1.2.2
Summary: Python package for parsing russian anime players
Author-email: YaNesyTortiK <ya.nesy.tortik.email@gmail.com>
Maintainer-email: YaNesyTortiK <ya.nesy.tortik.email@gmail.com>
License: Copyright 2024 YaNesyTortiK ya.nesy.tortik.email@gmail.com
        
        Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
        
        The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
        
        THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Project-URL: Homepage, https://github.com/YaNesyTortiK/AnimeParsers
Project-URL: Issues, https://github.com/YaNesyTortiK/AnimeParsers/issues
Keywords: anime,parser,kodik,parsing,aniboom,animego,аниме,парсинг,кодик,парсер,анибум,анимего
Classifier: Development Status :: 4 - Beta
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: beautifulsoup4 >=4.12
Requires-Dist: requests >=2.32
Requires-Dist: lxml >=5.2

# AnimeParsers
## Описание
Данный проект нацелен на создание наиболее широкого спектра парсеров на python для различных аниме-плееров в русскоязычном/снг сегменте

## Что есть на данный момент
- [x] Парсер Kodik (автоматическое получение api ключа)
- [x] Парсер AniBoom (на основе animego, не требует api ключей)

## Установка
```commandline
pip install anime-parsers-ru
```

# Инструкция к парсерам

## Оглавление
- [Kodik инструкция](#kodik-инструкция)
- [AniBoom инструкция](#aniboom-инструкция)

## Kodik инструкция

> [!TIP]
> В большинстве случаев в комментариях к функциям описаны шаблоны и возможные значения возвращаемых данных

0. Установите и импортируйте библиотеку
    ```commandline
    pip install anime-parsers-ru
    ```
    ```python
    from anime_parsers_ru.parser_kodik import KodikParser

    parser = KodikParser(<ваш api ключ>) # Если нет ключа, оставьте пустым
    ```

1. Поиск аниме по названию
    ```python
    parser.search("Наруто") # список словарей
    ```
    Возвращает словарь из аниме и их данных (см. комментарии к функции)

2. Получить информацию об аниме
    ```python
    parser.get_info("z20", "shikimori") # Информация по "Наруто"
    ```
    Возвращает:
    ```json
    {
        "series_count": 220, 
        "translations": [
            {"id": "735", "type": "Озвучка", "name": "2x2 (220 эп.)"}, 
            {"id": "609", "type": "Озвучка", "name": "AniDUB (220 эп.)"}, 
            {"id": "869", "type": "Субтитры", "name": "Субтитры (220 эп.)"}, 
            {"id": "958", "type": "Озвучка", "name": "AniRise (135 эп.)"}, 
            {"id": "2550", "type": "Озвучка", "name": "ANI.OMNIA (8 эп.)"}
        ]
    }
    ```

    - Получить отдельно кол-во серий:
        ```python
        parser.series_count("z20", "shikimori") # число
        ```
    - Получить отдельно переводы:
        ```python
        parser.translations("z20", "shikimori") # список словарей
        ```
3. Прямая ссылка на видеофайл
    ```python
    parser.get_link(
        id="z20", 
        id_type="shikimori", 
        seria_num=1, 
        translation_id="609") # Кортеж
    ```
    Возвращает кортеж: `("//cloud.kodik-storage.com/useruploads/67b6e546-e51d-43d2-bb11-4d8bfbedc2d7/d6f4716bc90bd30694cf09b0062d07a2:2024062705/", 720)`
    
    1. Ссылка
    Пример: `//cloud.kodik-storage.com/useruploads/67b6e546-e51d-43d2-bb11-4d8bfbedc2d7/d6f4716bc90bd30694cf09b0062d07a2:2024062705/`
    К данной ссылке в начале нужно добавить `http:` или `https:`, а в конце качество.mp4 (`720.mp4`) (Обычно доступны следующие варианты качества: `360`, `480`, `720`)
    2. Максимально возможное качество
    Прим: `720` (1280x720)

> [!IMPORTANT]
> В случае, если аниме является фильмом или содержит только одну серию, в параметр `seria_num` указывается значение `0`. В случае если перевод/субтитры неизвестны или нет выбора, в параметр `translation_id` указывается значение `"0"`


4. Получить токен
    ```python
    parser.get_token() # строка
    # Или
    KodikParser.get_token()
    ```
    Использует один из скриптов кодика в котором указан api ключ, поэтому может не работать из-за внесенных изменений

## AniBoom инструкция
0. Установите и импортируйте библиотеку
    ```commandline
    pip install anime-parsers-ru
    ```
    ```python
    from anime_parsers_ru.parser_aniboom import AniboomParser

    parser = AniboomParser()
    ```

1. Поиск по названию
    1. Быстрый поиск
    ```python
    parser.fast_search("Название аниме")
    ```
    Возвращает список из словарей в виде:
    ```json
    [
            {
                "title": "Название аниме",
                "year": "Год выпуска",
                "other_title": "Другое название(оригинальное название)",
                "type": "Тип аниме (ТВ сериалфильм, ...)",
                "link": "Ссылка на страницу с информацией",
                "animego_id": "id на анимего (по сути в ссылке на страницу с информацией последняя цифра и есть id)"
            },
        ]
    ```
    2. Поиск с дополнительной информацией / Расширенный поиск
    ```python
    parser.search("Название аниме")
    ```
    Возвращает список из словарей:
    ```json
    [
        {
            "title": "Название",
            "other_titles": ["Альтернативное название 1", "..."],
            "status": "Статус аниме (онгоинг, анонс, вышел, ...)",
            "type": "Тип аниме (ТВ сериал, фильм, ...)",
            "genres": ["Жанр1", "Жанр2", "..."],
            "description": "описание",
            "episodes": "если аниме вышло, то количество серий, если еще идет, то 'вышло / всего'",
            "episodes_info": [
                {
                    "num": "Номер эпизода",
                    "title": "Название эпизода",
                    "date": "Даты выхода (предполагаемые если анонс)
                    'status': 'вышло' или 'анонс' (Имеется в виду вышло в оригинале, не переведено)",
                },
            ],
            "translations": [
                {
                    "name": "Название студии",
                    "translation_id": "id перевода в плеере aniboom"
                },
            ],
            "poster_url": "Ссылка на постер аниме",
            "trailer": "Ссылка на ютуб embed трейлер",
            "screenshots": [
                "Список ссылок на скриншоты"
            ],
            "other_info": {
                // Данная информация может менятся в зависимости от типа или состояния тайтла
                "Возрастные ограничения": "(прим: 16+)",
                "Выпуск": "(прим: с 2 апреля 2024)",
                "Главные герои": ["Список главных героев"],
                "Длительность": "(прим: 23 мин. ~ серия)",
                "Первоисточник": "(прим: Легкая новвела)",
                "Рейтинг MPAA": "(прим: PG-13)",
                "Сезон": "(прим. Весна 2024)",
                "Снят по ранобэ": "название ранобэ (Или так же может быть 'Снят по манге')",
                "Студия": "название студии"
            },
            "link": "Ссылка на страницу с информацией",
            "animego_id": "id на анимего (по сути в ссылке на страницу с информацией последняя цифра и есть id)"
        },
    ]
    ```
2. Данные по эпизодам. Если в аниме 1 эпизод или это фильм, то данных по эпизодам может не быть.
    ```python
    parser.episodes_info('ссылка на страницу аниме на animego.org') # Ссылка доступна из поиска по ключу 'link'
    ```
    Возвращает отсортированный по номеру серии список:
    ```json
    [   
        {
            "num": "Номер эпизода",
            "title": "Название эпизода",
            "date": "Даты выхода (предполагаемые если анонс)",
            "status": "'вышло' или 'анонс' (Имеется в виду вышло в оригинале, не переведено)"
        },
    ]
    ```
3. Данные по аниме (как в полном/расширенном поиске)
    ```python
    parser.anime_info('ссылка на страницу аниме на animego.org') # Ссылка доступна из поиска по ключу 'link'
    ```
    Возвращает словарь:
    ```json
    {
        "title": "Название",
        "other_titles": ["Альтернативное название 1", "..."],
        "status": "Статус аниме (онгоинг, анонс, вышел, ...)",
        "type": "Тип аниме (ТВ сериал, фильм, ...)",
        "genres": ["Жанр1", "Жанр2", "..."]
        "description": "описание",
        "episodes": "если аниме вышло, то количество серий, если еще идет, то 'вышло / всего'",
        "episodes_info": [
            {
                "num": "Номер эпизода",
                "title": "Название эпизода",
                "date": "Даты выхода (предполагаемые если анонс)
                'status': 'вышло' или 'анонс' (Имеется в виду вышло в оригинале, не переведено)",
            },
        ],
        "translations": [
            {
                "name": "Название студии",
                "translation_id": "id перевода в плеере aniboom"
            },
        ],
        "poster_url": "Ссылка на постер аниме",
        "trailer": "Ссылка на ютуб embed трейлер",
        "screenshots": [
            "Список ссылок на скриншоты"
        ],
        "other_info": {
            // Данная информация может менятся в зависимости от типа или состояния тайтла
            "Возрастные ограничения": "(прим: 16+)",
            "Выпуск": "(прим: с 2 апреля 2024)",
            "Главные герои": ["Список главных героев"],
            "Длительность": "(прим: 23 мин. ~ серия)",
            "Первоисточник": "(прим: Легкая новвела)",
            "Рейтинг MPAA": "(прим: PG-13)",
            "Сезон": "(прим. Весна 2024)",
            "Снят по ранобэ": "название ранобэ (Или так же может быть 'Снят по манге')",
            "Студия": "название студии"
        },
        "link": "Ссылка на страницу с информацией",
        "animego_id": "id на анимего (по сути в ссылке на страницу с информацией последняя цифра и есть id)"
    },
    ```

4. Данные по переводам (которые есть в плеере aniboom)
    ```python
    parser.get_translation_info('animego_id') # Ссылка доступна из поиска по ключу 'animego_id'
    ```
    Возвращает список словарей:
    ```json
    [
        {
            "name": "Название студии озвучки",
            "translation_id": "id перевода в плеере aniboom"
        }
    ]
    ```

5. Получить контент файла mpd (mp4 файл разбитый на чанки) в виде строки. При сохранении данной строки в .mpd файл и при открытии его плеером, котрый поддерживает такой формат (прим: VLC PLayer), можно смотреть серию без рекламы. Обратите внимание, что в данном файле находятся именно ссылки на чанки, а не само видео, поэтому потребуется доступ в интернет. (Вы можете использовать ffmpeg для конвертации этого файла в mp4 формат)
    ```python
    parser.get_mpd_playlist('animego_id', 'episode_num', 'translation_id')
    # animego_id можно найти в результате поиска по ключу 'animego_id' (либо взять последние цифры в ссылке на страницу аниме на animego.org)
    # episode_num - номер вышедшего эпизода (нужно чтобы эпизод вышел именно с выбранной озвучкой)
    # translation_id - id перевода в базе aniboom (Можно найти либо в результате поиска, либо через anime_info, лмбо через get_translation_info)
    ```
    Возвращает строку - контент mpd файла
    
    > [!IMPORTANT]
    > В случае, если аниме является фильмом или содержит только одну серию, в параметр `episode_num` указывается значение `0`.

6. Сохранить mpd файл (Дополняет предыдущую функцию get_mpd_playlist)
    ```python
    parser.get_as_file('animego_id', 'episode_num', 'translation_id', 'filename')
    # animego_id можно найти в результате поиска по ключу 'animego_id' (либо взять последние цифры в ссылке на страницу аниме на animego.org)
    # episode_num - номер вышедшего эпизода (нужно чтобы эпизод вышел именно с выбранной озвучкой)
    # translation_id - id перевода в базе aniboom (Можно найти либо в результате поиска, либо через anime_info, лмбо через get_translation_info)
    # filename - имя файля или путь
    ```
    Сохраняет файл по указанному имени/пути

    > [!IMPORTANT]
    > В случае, если аниме является фильмом или содержит только одну серию, в параметр `episode_num` указывается значение `0`.
