vypivshiy / ani-cli-ru

Просмотр аниме с русской озвучкой в терминале
GNU General Public License v3.0
139 stars 6 forks source link

Больше #13

Open Nikola2222 opened 2 years ago

Nikola2222 commented 2 years ago

Хочу больше функций, а именно:

vypivshiy commented 2 years ago

После долгой эксплуатации скрипта есть схожие пожелания, но нынешняя кодовая база парсеров не очень удачно вышла и её необходимо переписать. Про CLI вообще без комментариев, там всё плохо и печально и проблемно расширять функционал. И, например, тот же requests заменить на httpx, чтобы добавить поддержку async запросов для асинхронных решений

vypivshiy commented 2 years ago

Провёл небольшие эксперименты, пришёл к выводу, что надо перестраивать базовую архитектуру, примерно как в yt-dlp:

Nikola2222 commented 2 years ago

Я думал взять yt-dlp, создавать аниме экстракторы к yt-dlp и сделать cli интерфейс для yt-dlp. Но у yt-dlp нету механизма для выбора озвучки. Насчет shikimori, я уже сделал для себя скрипт который работает на библиотеке но для аунтефикации нужно целую инструкцию делать потому что токены надо получать.

vypivshiy commented 2 years ago

Я думал взять yt-dlp, создавать аниме экстракторы к yt-dlp и сделать cli интерфейс для yt-dlp. Но у yt-dlp нету механизма для выбора озвучки. Насчет shikimori, я уже сделал для себя скрипт который работает на библиотеке но для аунтефикации нужно целую инструкцию делать потому что токены надо получать.

Извиняюсь за долгий ответ, словил ковид и лечился от него 😰, щас мне лучше, теперь по ответам на моё на видение развития проекта:

yt-dlp хороший инструмент, его реально использоваться для скачивания видео по прямым ссылкам на kodik/aniboom/sibnet etc. ссылках, но пока рано делать экстракторы под их решение, в планах перевести все запросы на httpx библиотеку, чтобы была поддержка http/2 протокола и asyncio, а также доработать решение выше, чтобы результаты поиска вхождений регулярных выражений было удобнее конвертировать в датаклассы для более удобной работы с полученными результатами. Оно пригодится, так как получение данных преимущественно идёт не через json api, на через парсинг html документа. Скриншот выше это не конечный результат программного интерфейса, будут доработки, как и с сама архитектура проекта будет переделана. image

Shikimori можно без токена использовать, если только надо получать информацию о контенте, сторонние решения скорее всего не буду использовать, а буду полагаться на автоматическую генерацию API на основе их официальной документации, если конечно не будет готового под httpx, чтобы и sync и async умел одновременно.

Pull requests пока не буду принимать, пока не будет видна чёткая архитектура проекта, актуальное решение под получение подробных метаданных по типу картинок, описания, трейлеров и ТД не удобно и не годится

Nikola2222 commented 2 years ago

Хорошо, я понял. Нужна архитектура. Вот еще список не реализуемых желаний:

vypivshiy commented 2 years ago

Хорошо, я понял. Нужна архитектура. Вот еще список не реализуемых желаний:

  • [ ] Поиск аниме по жанрам, категориям, годам, типу, статусу. Для этого нужно чтобы экстракторы парсили всё на свете.
  • [ ] Случайное аниме. Некоторые сайты умеют выдавать случайное аниме, например animego. Тоже парсить.
  • [ ] Сортировка аниме. Сайты это умеют нужно только запрос кинуть и тоже парсить.
  • [ ] Комментарии. Парсить комментарии прямо с сайтов.
  • [ ] Расписание выхода серий. На некоторых сайтах это есть.

Это решение изначально был скрипт на 300 строк под animego и был рассчитан на применение в *nix системах в терминале. В ходе расширения проекта допустил косяки в написании, не задумываясь особо на расширяемость, гибкость и удобную ремонтопригодность проекта. Например, я зашел в один из экстракторов и запутался в коде 😅

В планах примерно у меня будут следующие действия:

После масштабного рефакторинга (скорее всего переписывание хех) можно будет действовать.

Из пунктов выше получение комментариев out of scope, этот проект про просмотр мультиков, а не создание альтернативного клиента под каждый источник (если конечно не докинут регулярных выражений). Случайный поиск я хотел добавить, но тогда регулярные выражения нестабильные были и в основном клиент крашился с ошибкой да и не везде он есть, - эта фича тоже под вопросом.

vypivshiy commented 2 years ago

В dev ветке переписал код с рабочей реализацией animego, это не конечный вариант, регулярные выражения не проверены временем и могут "давать осечку".

Вкратце, следующие изменения:

https://github.com/vypivshiy/ani-cli-ru/tree/dev/anicli_api

В приоритете:

После этого будет перенос остальных экстракторов, обновление CLI утилиты, добавление shikimori

Nikola2222 commented 2 years ago

Это все хорошо, но писать регулярки это ад. Это их надо упрощать, почему нельзя весь html сериализовать или хотя бы делать срезы в нужных местах.

vypivshiy commented 2 years ago

Это все хорошо, но писать регулярки это ад. Это их надо упрощать, почему нельзя весь html сериализовать или хотя бы делать срезы в нужных местах.

Это да, время надо для написание надёжных регулярных выражений, но это универсальный способ всё получать, а в некоторых местах вообще неприменимо будет использовать такие решения по типу bs4. Сложность только можно частично снизить документацией с примерами как здесь и здесь при быстрой проверке с помощью этого онлайн инструмента regex101 image Насчёт bs4: Здесь, например, можно взять dl class "row" элемент, а как дальше распарсить, чтобы занимало минимум строк кода и было надёжно и проще в фиксах при изменении не знаю. xpath/css селекторы будут не применимы в конкретно этом случае это точно.

Если я не прав, можешь написать идею с примером на bs4, его было бы использовать для упрощения для таких ситуаций, но он только эффективен в xml/html, большинство задач только регулярками решать

Nikola2222 commented 2 years ago

Да, я согласен. Это было просто моё нытьё.

определить шаблон структуры под парсеры. Чтобы было твёрдо и чётко

Я заметил что регулярки в SearchResult и Ongoing почти одинаковые. Можно это как-то сократить?

vypivshiy commented 2 years ago

определить шаблон структуры под парсеры. Чтобы было твёрдо и чётко

Я заметил что регулярки в SearchResult и Ongoing почти одинаковые. Можно это как-то сократить?

Это обязательно надо делать, эта первая реализация like Proof of Concept, будут изменения

Насчёт bs4: я не использовал продвинутые фичи этой библиотеки, посмотрел документацию и оказывается умеет принимать регулярные выражения, списки и функции с необходимым фильтрами. https://www.crummy.com/software/BeautifulSoup/bs4/doc/#soupstrainer https://www.crummy.com/software/BeautifulSoup/bs4/doc/#a-regular-expression

И провёл тесты, если докинуть транслятор ключей на латиницу, то вполне оправдано частично от регулярок отказаться для упрощения написания

from bs4 import BeautifulSoup
import pathlib

def extract_meta(text: str):
    soup = BeautifulSoup(text, "html.parser")
    title = soup.find("div", attrs={"class": "anime-title"}).find_next("h1").get_text()
    synonyms = [t.get_text(strip=True) for t in soup.find("div", attrs={"class": "synonyms"}).find_all("li")]
    rating = soup.find("span", class_="rating-value").get_text(strip=True)
    print(title, synonyms, rating)
    meta_table = soup.find("dl", attrs={"class": "row"})
    keys, values = [], []
    for el in meta_table.find_all("dt"):
        key = el.get_text(strip=True)
        value = el.find_next("dd").get_text(strip=True)
        keys.append(key)
        values.append(value)
        print(key, value)
    rez = dict(zip(keys, values))
    print(len(rez.keys()), rez)
    print("----")

if __name__ == '__main__':
    txt = pathlib.Path("test.html").read_text()
    extract_meta(txt)
    from anicli_api._http import BaseHTTPSync  # equal httpx.get or requests.get with set headers
    txt2 = BaseHTTPSync().session.get("https://animego.org/anime/eksperimenty-leyn-m1114").text
    extract_meta(txt2)
    txt3 = BaseHTTPSync().session.get("https://animego.org/anime/mastera-mecha-onlayn-309").text
    extract_meta(txt3)
    txt4 = BaseHTTPSync().session.get("https://animego.org/anime/vayolet-evergarden-film-m1778").text
    extract_meta(txt4)

output:

Человек-бензопила ['Chainsaw Man', 'Chainsaw Man', 'チェンソーマン'] 9,6
Следующий эпизод 1 нояб. 2022 вт 18:00ожидается выход 4 серии
Тип ТВ Сериал
Эпизоды 3 /12
Статус Онгоинг
Жанр Демоны,Приключения,Сверхъестественное,Сёнэн,Экшен
Первоисточник Манга
Сезон Осень 2022
Выпуск с 12 октября 2022
Студия MAPPA
Рейтинг MPAA NC-17
Возрастные ограничения 18+
Длительность 25 мин. ~ серия
Снят по манге Человек-бензопила
Главные герои Дэндзи,Аки Хаякава,Макима,Пауэр
14 {'Следующий эпизод': '1 нояб. 2022 вт 18:00ожидается выход 4 серии', 'Тип': 'ТВ Сериал', 'Эпизоды': '3 /12', 'Статус': 'Онгоинг', 'Жанр': 'Демоны,Приключения,Сверхъестественное,Сёнэн,Экшен', 'Первоисточник': 'Манга', 'Сезон': 'Осень 2022', 'Выпуск': 'с 12 октября 2022', 'Студия': 'MAPPA', 'Рейтинг MPAA': 'NC-17', 'Возрастные ограничения': '18+', 'Длительность': '25 мин. ~ серия', 'Снят по манге': 'Человек-бензопила', 'Главные герои': 'Дэндзи,Аки Хаякава,Макима,Пауэр'}
----
Эксперименты Лэйн ['Serial Experiments Lain', 'Serial Experiments Lain', 'シリアルエクスペリメンツレイン'] 8,5
Тип ТВ Сериал
Эпизоды 13
Статус Вышел
Жанр Безумие,Детектив,Драма,Психологическое,Сверхъестественное,Фантастика
Первоисточник Оригинал
Сезон Лето 1998
Выпуск с 6 июля 1998 по 28 сентября 1998
Студия Triangle Staff
Рейтинг MPAA NC-17
Возрастные ограничения 18+
Длительность 23 мин. ~ серия
Озвучка XL Media
Режиссёр Масахико Мурата,Накамура Рютаро,Уэда Сигэру
Снят по манге Эксперименты Лэйн: Кошмар подделки
Автор оригинала Ясуюки Уэда
Главные герои Lain Iwakura
16 {'Тип': 'ТВ Сериал', 'Эпизоды': '13', 'Статус': 'Вышел', 'Жанр': 'Безумие,Детектив,Драма,Психологическое,Сверхъестественное,Фантастика', 'Первоисточник': 'Оригинал', 'Сезон': 'Лето 1998', 'Выпуск': 'с 6 июля 1998 по 28 сентября 1998', 'Студия': 'Triangle Staff', 'Рейтинг MPAA': 'NC-17', 'Возрастные ограничения': '18+', 'Длительность': '23 мин. ~ серия', 'Озвучка': 'XL Media', 'Режиссёр': 'Масахико Мурата,Накамура Рютаро,Уэда Сигэру', 'Снят по манге': 'Эксперименты Лэйн: Кошмар подделки', 'Автор оригинала': 'Ясуюки Уэда', 'Главные герои': 'Lain Iwakura'}
----
Мастера Меча Онлайн ['Sword Art Online', 'Sword Art Online', 'ソードアート・オンライン', 'S.A.O', 'SAO', 'Искусство Меча Онлайн'] 9,2
Тип ТВ Сериал
Эпизоды 25
Статус Вышел
Жанр Игры,Приключения,Романтика,Фэнтези,Экшен
Первоисточник Легкая новвела
Сезон Лето 2012
Выпуск с 8 июля 2012 по 23 декабря 2012
Студия A-1 Pictures Inc.
Рейтинг MPAA PG-13
Возрастные ограничения 18+
Длительность 23 мин. ~ серия
Озвучка AniDUB,AniLibria,SHIZA Project,Onibaku Group,AniMedia,СВ-Дубль
Режиссёр Морио Асака,Томохико Ито
Снят по ранобэ Мастера Меча Онлайн,Мастера Меча Онлайн: Прогрессив
Автор оригинала Рэки Кавахара
Главные герои Кадзуто Киригая,Сугуха Киригая,Асуна Юки
16 {'Тип': 'ТВ Сериал', 'Эпизоды': '25', 'Статус': 'Вышел', 'Жанр': 'Игры,Приключения,Романтика,Фэнтези,Экшен', 'Первоисточник': 'Легкая новвела', 'Сезон': 'Лето 2012', 'Выпуск': 'с 8 июля 2012 по 23 декабря 2012', 'Студия': 'A-1 Pictures Inc.', 'Рейтинг MPAA': 'PG-13', 'Возрастные ограничения': '18+', 'Длительность': '23 мин. ~ серия', 'Озвучка': 'AniDUB,AniLibria,SHIZA Project,Onibaku Group,AniMedia,СВ-Дубль', 'Режиссёр': 'Морио Асака,Томохико Ито', 'Снят по ранобэ': 'Мастера Меча Онлайн,Мастера Меча Онлайн: Прогрессив', 'Автор оригинала': 'Рэки Кавахара', 'Главные герои': 'Кадзуто Киригая,Сугуха Киригая,Асуна Юки'}
----
Вайолет Эвергарден. Фильм ['Violet Evergarden Movie', '劇場版 ヴァイオレット・エヴァーガーデン', 'Gekijouban Violet Evergarden'] 9,5
Тип Фильм
Жанр Драма,Повседневность,Фэнтези
Первоисточник Легкая новвела
Выпуск 18 сентября 2020
Студия Kyoto Animation
Рейтинг MPAA PG-13
Возрастные ограничения 16+
Длительность 2 ч. 20 мин.
Озвучка Reanimedia
Снят по ранобэ Вайолет Эвергарден
Главные герои Гилберт Бугенвиллея,Вайолет Эвергарден
11 {'Тип': 'Фильм', 'Жанр': 'Драма,Повседневность,Фэнтези', 'Первоисточник': 'Легкая новвела', 'Выпуск': '18 сентября 2020', 'Студия': 'Kyoto Animation', 'Рейтинг MPAA': 'PG-13', 'Возрастные ограничения': '16+', 'Длительность': '2 ч. 20 мин.', 'Озвучка': 'Reanimedia', 'Снят по ранобэ': 'Вайолет Эвергарден', 'Главные герои': 'Гилберт Бугенвиллея,Вайолет Эвергарден'}
----

Process finished with exit code 0
vypivshiy commented 2 years ago

С архитектурой закончено, что осталось для релиза:

vypivshiy commented 2 years ago

более менее рабочая версия есть с 75% покрытием тестами. осталось CI/CD настроить, остальные парсеры перенести, допилить документацию для контрибьютеров.

после этого приступлю к переписыванию CLI интерфейса в этом репозитории, а пока можешь посмотреть наработки https://github.com/vypivshiy/anicli-api

vypivshiy commented 1 year ago

api обёртка пока более менее готова с какой то документацией и надежность есть хотя бы на уровне тестов, теперь будут эксперименты с дизайном CLI клиента на базе prompt_toolkit

Его выбрал по следующим причинам:

image

image

Nikola2222 commented 1 year ago

Это круто!

vypivshiy commented 1 year ago

Накидал демку с архитектурой как у популярных популярных ботов и микро веб феймворков

Предполагаю, что такое решение будет сбалансировано в плане простоты добавления, изменения функционала и кастомизации. И если кому-то будет не лень, то реально и встраивать те же диалоговые окна

Пока не хватает middleware фильтров и прочие мелкие фиксы

image

https://user-images.githubusercontent.com/59173419/207610089-bc1ca8c9-4cc4-4be1-8db4-ca2051601e3e.mp4

https://github.com/vypivshiy/ani-cli-ru/tree/dev

vypivshiy commented 1 year ago

Накидал более "реалистичную" демку CLI-prompt клиента.

В будущем примерно так будет выглядеть структура проекта, но есть недостатки:

А так считаю удачной эту экспериментальную обёртку под prompt-toolkit, в будущем можно отделить эту логику в другой репозиторий, для удобного выполнения подобных задач.

https://user-images.githubusercontent.com/59173419/208140755-21322ad2-20d7-4c05-85b6-117a3ef0f572.mp4

vypivshiy commented 1 year ago

очередная сырая демка. Функционал как в самых первых коммитах: только animego и по одному видео загружать

https://user-images.githubusercontent.com/59173419/209024879-fcacd202-571c-4874-9617-9033b0aa0314.mp4

Nikola2222 commented 1 year ago

На основе prompt-toolkit сделан не только клон vim'a, но и клон tmux это значит что в теории можно сделать вкладки, и превратить это в консольный браузер где можно смотреть несколько аниме одновременно.

Nikola2222 commented 1 year ago

https://user-images.githubusercontent.com/24852736/210776766-a0eed18c-da51-4ce7-b5a6-d51e1e1ff84b.mp4

Я увидел удобную фичу в anipy-cli, где после каждого просмотра эпизода пользователю предлагают сразу запустить следующий эпизод, а то постоянно писать номера серий не очень удобно. Еще думаю нужно для красоты сделать чтобы название тайтла и номер серии передавались в заголовок окна mpv.

vypivshiy commented 1 year ago

Я увидел удобную фичу в anipy-cli, где после каждого просмотра эпизода пользователю предлагают сразу запустить следующий эпизод, а то постоянно писать номера серий не очень удобно. Еще думаю нужно для красоты сделать чтобы название тайтла и номер серии передавались в заголовок окна mpv.

С заголовком mpv окна хорошая идея.

А теперь что сделано:

Отдаленно напоминает по дизайну фреймворки под ботов. Тема создания терминальных приложений в наше время маргинальная, по удобным инструментам всё скудно, поэтому имеем такой костыльный велосипед

Пока еще сыро и присутствуют баги с недочетами, осталось их устранить и будет можно лить в мастер с pypi. И докину сюда доску с тасками как и что развивать в планах дальше, вроде на гитхабе так можно делать раз уж с архитектурной частью проекта более менее вопросы решены

https://user-images.githubusercontent.com/59173419/212438536-14b46105-c773-430c-aaf7-dfa8c0885a1b.mp4