Данный проект нацелен на создание наиболее широкого спектра парсеров на python для различных аниме-плееров в русскоязычном/снг сегменте
-
Установите и импортируйте библиотеку
Стандартно:
pip install anime-parsers-ru
С lxml:
pip install anime-parsers-ru[lxml]
from anime_parsers_ru import KodikParser
parser = KodikParser(<ваш api ключ>)
Для асинхронного кода:
pip install anime-parsers-ru[async]
(Установка без lxml)
from anime_parsers_ru import KodikParserAsync
parser = KodikParserAsync(<ваш api ключ>)
-
Поиск аниме по названию
parser.search(title="Наруто", limit=None, include_material_data=True, anime_status=None, strict=False, only_anime=False)
Возвращает:
[
{
"title": "Название",
"type": "тип мультимедия (anime, film, ...)",
"year": "Год выпуска фильма",
"screenshots": [
"ссылки на скриншоты"
],
"shikimori_id": "Id шикимори, если нет - None",
"kinopoisk_id": "Id кинопоиска, если нет - None",
"imdb_id": "Id imdb, если нет - None",
"worldart_link": "ссылка на worldart, если нет - None",
"additional_data": {
"Здесь будут находится все остальные данные выданные кодиком, не связанные с отдельным переводом"
},
"material_data": {
"Здесь будут все данные о сериале имеющиеся у кодика. (None если указан параметр include_material_data=False)
В том числе оценки на шикимори, статус выхода, даты анонсов, выхода, все возможные названия, жанры, студии и многое другое."
},
"link": "ссылка на kodik.info (Пример: //kodik.info/video/20609/e8fd5bc1190b7eb1ee1a3e1c3aec5f62/720p)"
},
]
-
Поиск аниме по id
parser.search_by_id(id="20", id_type="shikimori", limit=None)
Возвращает:
[
{
"title": "Название",
"type": "тип мультимедия (anime, film, ...)",
"year": "Год выпуска фильма",
"screenshots": [
"ссылки на скриншоты"
],
"shikimori_id": "Id шикимори, если нет - None",
"kinopoisk_id": "Id кинопоиска, если нет - None",
"imdb_id": "Id imdb, если нет - None",
"worldart_link": "ссылка на worldart, если нет - None",
"additional_data": {
"Здесь будут находится все остальные данные выданные кодиком, не связанные с отдельным переводом"
},
"material_data": {
"Здесь будут все данные о сериале имеющиеся у кодика. (None если указан параметр include_material_data=False)
В том числе оценки на шикимори, статус выхода, даты анонсов, выхода, все возможные названия, жанры, студии и многое другое."
},
"link": "ссылка на kodik.info (Пример: //kodik.info/video/20609/e8fd5bc1190b7eb1ee1a3e1c3aec5f62/720p)"
},
]
-
Получить список аниме
data = parser.get_list(limit_per_page=50, pages_to_parse=1, include_material_data=True, anime_status=None, only_anime=False, start_from=None)
Возвращает:
(
[
{
"title": "Название",
"type": "тип мультимедия (anime, film, ...)",
"year": "Год выпуска фильма",
"screenshots": [
"ссылки на скриншоты"
],
"shikimori_id": "Id шикимори, если нет - None",
"kinopoisk_id": "Id кинопоиска, если нет - None",
"imdb_id": "Id imdb, если нет - None",
"worldart_link": "ссылка на worldart, если нет - None",
"additional_data": {
"Здесь будут находится все остальные данные выданные кодиком, не связанные с отдельным переводом"
},
"material_data": {
"Здесь будут все данные о сериале имеющиеся у кодика. (None если указан параметр include_material_data=False)
В том числе оценки на шикимори, статус выхода, даты анонсов, выхода, все возможные названия, жанры, студии и многое другое."
},
"link": "ссылка на kodik.info (Пример: //kodik.info/video/20609/e8fd5bc1190b7eb1ee1a3e1c3aec5f62/720p)"
},
],
"next_page_id": "id следующей страницы (для последовательного парсинга нескольких страниц) (может быть None, если след. страниц нет)"
)
-
Получить информацию об аниме
parser.get_info(id="z20", id_type="shikimori")
Возвращает:
{
"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 эп.)"}
]
}
- Получить отдельно кол-во серий:
parser.series_count("z20", "shikimori")
- Получить отдельно переводы:
parser.translations("z20", "shikimori")
-
Прямая ссылка на видеофайл
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)
- Ссылка
Пример:
//cloud.kodik-storage.com/useruploads/67b6e546-e51d-43d2-bb11-4d8bfbedc2d7/d6f4716bc90bd30694cf09b0062d07a2:2024062705/
К данной ссылке в начале нужно добавить http:
или https:
, а в конце качество.mp4 (720.mp4
) (Обычно доступны следующие варианты качества: 360
, 480
, 720
) - Максимально возможное качество
Прим:
720
(1280x720)
-
Установите и импортируйте библиотеку
pip install anime-parsers-ru
from anime_parsers_ru import AniboomParser
parser = AniboomParser()
Для асинхронного кода:
pip install anime-parsers-ru[async]
from anime_parsers_ru import AniboomParserAsync
parser = AniboomParserAsync()
-
Поиск по названию
- Быстрый поиск
parser.fast_search("Название аниме")
Возвращает список из словарей в виде:
[
{
"title": "Название аниме",
"year": "Год выпуска",
"other_title": "Другое название(оригинальное название)",
"type": "Тип аниме (ТВ сериалфильм, ...)",
"link": "Ссылка на страницу с информацией",
"animego_id": "id на анимего (по сути в ссылке на страницу с информацией последняя цифра и есть id)"
},
]
- Поиск с дополнительной информацией / Расширенный поиск
parser.search("Название аниме")
Возвращает список из словарей:
[
{
"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)"
},
]
-
Данные по эпизодам. Если в аниме 1 эпизод или это фильм, то данных по эпизодам может не быть.
parser.episodes_info('ссылка на страницу аниме на animego.org')
Возвращает отсортированный по номеру серии список:
[
{
"num": "Номер эпизода",
"title": "Название эпизода",
"date": "Даты выхода (предполагаемые если анонс)",
"status": "'вышло' или 'анонс' (Имеется в виду вышло в оригинале, не переведено)"
},
]
-
Данные по аниме (как в полном/расширенном поиске)
parser.anime_info('ссылка на страницу аниме на animego.org')
Возвращает словарь:
{
"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)"
},
-
Данные по переводам (которые есть в плеере aniboom)
parser.get_translation_info('animego_id')
Возвращает список словарей:
[
{
"name": "Название студии озвучки",
"translation_id": "id перевода в плеере aniboom"
}
]
-
Получить контент файла mpd (mp4 файл разбитый на чанки) в виде строки. При сохранении данной строки в .mpd файл и при открытии его плеером, котрый поддерживает такой формат (прим: VLC PLayer), можно смотреть серию без рекламы. Обратите внимание, что в данном файле находятся именно ссылки на чанки, а не само видео, поэтому потребуется доступ в интернет. (Вы можете использовать ffmpeg для конвертации этого файла в mp4 формат)
parser.get_mpd_playlist('animego_id', 'episode_num', 'translation_id')
Возвращает строку - контент mpd файла
-
Установите и импортируйте библиотеку
pip install anime-parsers-ru
from anime_parsers_ru import JutsuParser
parser = JutsuParser()
-
Данные по аниме (по ссылке на страницу)
parser.get_anime_info("Ссылка на страницу")
Возвращает словарь:
{
"title": "Название аниме",
"origin_title": "Оригинальное название (транслит японского названия на английском)",
"age_rating": "Возрастное ограничение",
"description": "Описание",
"years": ["Год выхода 1 сезона", "Год выхода 2 сезона"],
"genres": ["Жанр 1", "Жанр 2"],
"poster": "Ссылка на картинку (плохое качество)",
"seasons": [
[
"ссылка на 1 серию 1 сезона (страница с плеером)",
"ссылка на 2 серию 1 сезона (страница с плеером)"
],
[
"ссылка на 1 серию 2 сезона (страница с плеером)",
"ссылка на 2 серию 2 сезона (страница с плеером)"
],
],
"seasons_names": [
"Название 1 сезона",
"Название 2 сезона"
],
"films": [
"Ссылка на фильм 1 (страница с плеером)",
"Ссылка на фильм 2 (страница с плеером)",
]
}
-
Получить ссылку на mp4 файл
parser.get_mp4_link('ссылка на страницу с плеером')
Возвращает словарь:
{
"360": "ссылка на mp4 файл с качеством 360p",
}
-
Поиск аниме по названию
parser.search('Название аниме')
Возвращает список словарей:
[
{
"genres": ["Жанр1", "Жанр2"],
"link": "Ссылка на страницу аниме",
"original_title": "Оригинальное название (транслит японского названия на английском)",
"poster": "Ссылка на постер к аниме (плохое качество) (если есть, иначе None)",
"shikimori_id": "id шикимори",
"status": "статус (вышло, онгоинг, анонс) (если есть, иначе None)",
"studio": "студия анимации (если есть, иначе None)",
"title": "Название",
"type": "тип аниме (TV сериал, OVA, ONA, ...) (если есть, иначе None)",
"year": "год выхода (если есть, иначе None)"
}
]
-
Информация об аниме
parser.anime_info('shikimori id')
Возвращает словарь:
{
"dates": "Даты выхода",
"description": "Описание",
"episode_duration": "Средняя продолжительность серии",
"episodes": "Количество эпиходов если статус 'вышло' или 'вышедших эпизодов / анонсировано эпизодов' или None (если фильм)",
"genres": ["Жанр1", "Жанр2"],
"licensed": "Кто лицензировал в РФ или None",
"licensed_in_ru": "Название аниме как лицензировано в РФ или None",
"next_episode": "Дата выхода следующего эпизода или None",
"original_title": "Оригинальное название",
"picture": "Ссылка на jpeg постер",
"premiere_in_ru": "Дата премьеры в РФ или None",
"rating": "возрастной рейтинг",
"score": "оценка на шикимори",
"status": "статус выхода",
"studio": "студия анимации",
"themes": ["Тема1", "Тема2"],
"title": "Название на русском",
"type": "тип аниме (TV Сериал, Фильм, т.п.)"
}
-
Дополнительная информация об аниме (связанные аниме (продолжения, предыстории), авторы, главные персонажи, скриншоты, видео, похожие аниме)
parser.additional_anime_info('Ссылка на страницу шикимори')
Возвращает словарь:
{
"related": [
{
"date": "Даты выхода/сезон",
"name": "Название",
"picture": "Ссылка на картинку",
"relation": "тип связи (продолжение, предыстория, адаптация и т.п.)",
"type": "Тип (TV сериал, OVA, ONA, манга, ранобэ и т.д.)",
"url": "Ссылка на страницу шикимори"
}
],
"staff": [
{
"name": "Имя человека (на русском)",
"roles": ["Роль1", "Роль2"],
"link": "ссылка шикимори на человека"
}
],
"main_characters": [
{
"name": "Имя персонажа",
"picture": "Картинка (jpeg)"
}
],
"screenshots": ["Ссылка на скриншот 1", "Ссылка на скриншот 2"],
"videos": [
{
"name": "Название видео",
"link": "Ссылка на видео (обычно ютуб)"
}
],
"similar": [
{
"name": "Название аниме (похожего)",
"picture": "Картинка (постер)",
"link": "Ссылка на шикимори"
}
]
}
-
Получить список аниме с шикимори по фильтрам
parser.get_anime_list(status=['статус аниме1', 'статус аниме2'], anime_type=['тип аниме1', 'тип аниме2'], rating='возрастной рэйтинг', genres=['Жанр1', 'Жанр2'], start_page='начальная страница', page_limit='количество страниц для парсинга', sort_by='принцип сортировки')
Доступные фильтры:
-
status - текущие статусы выхода (по умолчанию пусто (не учитывается в фильтрах))
Список доступных статусов
- ongoing - онгоинг
- anons - анонс
- released - вышло
- latest - вышло недавно
-
anime_type - типы аниме (по умолчанию пусто (не учитывается в фильтрах))
Список доступных типов
- tv - TV Сериал
- movie - Фильм
- ova - OVA
- ona - ONA
- special - спецвыпуск
- tv_special - TV спецвыпуск
- music - клип
- pv - проморолик
- cm - реклама
-
rating - возрастной рэйтинг (по умолчанию None (не учитывается в фильтрах))
Список доступных возрастных рэйтингов
- g - нет возрастного ограничения
- pg - рекомендуется присутствие родителей
- pg_13 - детям до 13 просмотр не желателен
- r - Лицам до 17 лет обязательно присутствие взрослого
- r_plus - Лицам до 17 лет просмотр запрещен
(Рэйтинг rx - доступен только с аккаунтом (т.к. 18+) для поиска по такому рэйтингу воспользуйтесь функцией deep_anime_search (описано ниже))
-
genres - Список жанров аниме (сюда же темы) (по умолчанию пусто (не учитывается в фильтрах))
Список доступных жанров
При передаче аргумента обязательно указывать жанр как указано в списке ниже
(То есть "{номер}-{название на английском}")
{
"1-Action": "Экшен",
"2-Adventure": "Приключения",
"3-Racing": "Гонки",
"4-Comedy": "Комедия",
"5-Avant-Garde": "Авангард",
"6-Mythology": "Мифология",
"7-Mystery": "Тайна",
"8-Drama": "Драма",
"9-Ecchi": "Этти",
"10-Fantasy": "Фэнтези",
"11-Strategy-Game": "Стратегические игры",
"13-Historical": "Исторический",
"14-Horror": "Ужасы",
"15-Kids": "Детское",
"17-Martial-Arts": "Боевые искусства",
"18-Mecha": "Меха",
"19-Music": "Музыка",
"20-Parody": "Пародия",
"21-Samurai": "Самураи",
"22-Romance": "Романтика",
"23-School": "Школа",
"24-Sci-Fi": "Фантастика",
"25-Shoujo": "Сёдзё",
"27-Shounen": "Сёнен",
"29-Space": "Космос",
"30-Sports": "Спорт",
"31-Super-Power": "Супер сила",
"32-Vampire": "Вампиры",
"35-Harem": "Гарем",
"36-Slice-of-Life": "Повседневность",
"37-Supernatural": "Сверхъестественное",
"38-Military": "Военное",
"39-Detective": "Детектив",
"40-Psychological": "Психологическое",
"42-Seinen": "Сэйнэн",
"43-Josei": "Дзёсей",
"102-Team-Sports": "Командный спорт",
"103-Video-Game": "Видеоигры",
"104-Adult-Cast": "Взрослые персонажи",
"105-Gore": "Жестокость",
"106-Reincarnation": "Реинкарнация",
"107-Love-Polygon": "Любовный многоугольник",
"108-Visual-Arts": "Изобразительное искусство",
"111-Time-Travel": "Путешествие во времени",
"112-Gag-Humor": "Гэг-юмор",
"114-Award-Winning": "Удостоено наград",
"117-Suspense": "Триллер",
"118-Combat-Sports": "Спортивные единоборства",
"119-CGDCT": "CGDCT",
"124-Mahou-Shoujo": "Махо-сёдзё",
"125-Reverse-Harem": "Реверс-гарем",
"130-Isekai": "Исэкай",
"131-Delinquents": "Хулиганы",
"134-Childcare": "Забота о детях",
"135-Magical-Sex-Shift": "Магическая смена пола",
"136-Showbiz": "Шоу-бизнес",
"137-Otaku-Culture": "Культура отаку",
"138-Organized-Crime": "Организованная преступность",
"139-Workplace": "Работа",
"140-Iyashikei": "Иясикэй",
"141-Survival": "Выживание",
"142-Performing-Arts": "Исполнительское искусство",
"143-Anthropomorphic": "Антропоморфизм",
"144-Crossdressing": "Кроссдрессинг",
"145-Idols-(Female)": "Идолы (Жен.)",
"146-High-Stakes-Game": "Игра с высокими ставками",
"147-Medical": "Медицина",
"148-Pets": "Питомцы",
"149-Educational": "Образовательное",
"150-Idols-(Male)": "Идолы (Муж.)",
"151-Romantic-Subtext": "Романтический подтекст",
"543-Gourmet": "Гурман"
}
-
start_page - начальная страница (начиная с 1) (по умолчанию 1)
-
page_limit - какое количество страниц парсить (по умолчанию 3)
-
sort_by - тип сортировки (по умолчанию rating)
Список доступных сортировок
- rating - по рэйтингу
- popularity - по популярности
- name - по алфавиту
- aired_on - по дате выхода
- ranked_random - случайно
- id_desc - по id шикимори
[!] Если один из переданных параметров будет неверным (не содержится в списке доступных) - программа автоматически пропустит его.
Возвращает список словарей:
{
"original_title": "Оригинальное название (на английском)",
"poster": "Ссылка на картинку-постер",
"shikimori_id": "id шикимори",
"title": "Название на русском",
"type": "Тип аниме (TV Сериал, ONA, ...)",
"url": "Ссылка на страницу аниме",
"year": "год выхода аниме"
}
-
Вспомогательные функции
-
Поиск аниме и информации по аниме через псевдо api shikimori
Данные функции используют предоставленную shikimori тестовую функцию для api. (https://shikimori.one/api/doc/graphql)
Подробные примеры запросов и ответов вы можете посмотреть в файле SHIKI_API.md
-
Поиск аниме
parser.deep_search(
title='Название аниме',
search_parameters={'поисковый параметр 1': 'значение поискового параметра 1'},
return_parameters=['Параметр результата 1', 'параметр результата 2']
)
Возвращает список словарей
-
Информация об аниме по id
parser.deep_anime_info(
shikimori_id='id шикимори',
return_parameters=['Параметр результата 1', 'параметр результата 2']
)
Возвращает словарь