quarckster / kodi.kino.pub

Kodi add-on for kino.pub
BSD 3-Clause "New" or "Revised" License
87 stars 18 forks source link

Proxy support #325

Closed nikolaev-rd closed 7 months ago

nikolaev-rd commented 9 months ago

Добавлена поддержка прокси для запросов плагина к API Kino.pub

Не дождавшись ответа/реакции на тикет https://github.com/quarckster/kodi.kino.pub/issues/318, решил реализовать поддержку прокси самостоятельно. Resolves https://github.com/quarckster/kodi.kino.pub/issues/318

Как это работает

Плагин использует системные настройки прокси, которые задаются через меню: System → Internet Access

image

Плагин проверяет, что системная настройка "Use proxy server" включена, далее распознает указанный тип прокси, и устанавливает этот прокси для всех запросов к API.

Для получения системных настроек написан отдельный класс — работает через JSONRPC API через метод Settings.GetSettingValue

Что умеет

Теперь плагин поддерживает прокси всех типов (с авторизацией и без):

Проверка

Протестировано на прокси HTTP (без авторизации) и SOCKS5 (с авторизацией).

nikolaev-rd commented 9 months ago

На новом устройстве обнаружил еще место, где надо тоже добавить поддержку прокси (auth.py):

2024-02-04 21:07:11.955 T:906     error <general>: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
                                                    - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
                                                   Error Type: <class 'urllib.error.URLError'>
                                                   Error Contents: <urlopen error [Errno 104] Connection reset by peer>
                                                   Traceback (most recent call last):
                                                     File "/usr/lib/python3.11/urllib/request.py", line 1348, in do_open
                                                     File "/usr/lib/python3.11/http/client.py", line 1282, in request
                                                     File "/usr/lib/python3.11/http/client.py", line 1328, in _send_request
                                                     File "/usr/lib/python3.11/http/client.py", line 1277, in endheaders
                                                     File "/usr/lib/python3.11/http/client.py", line 1037, in _send_output
                                                     File "/usr/lib/python3.11/http/client.py", line 975, in send
                                                     File "/usr/lib/python3.11/http/client.py", line 1454, in connect
                                                     File "/usr/lib/python3.11/ssl.py", line 517, in wrap_socket
                                                     File "/usr/lib/python3.11/ssl.py", line 1075, in _create
                                                     File "/usr/lib/python3.11/ssl.py", line 1346, in do_handshake
                                                   ConnectionResetError: [Errno 104] Connection reset by peer

                                                   During handling of the above exception, another exception occurred:

                                                   Traceback (most recent call last):
                                                     File "/storage/.kodi/addons/video.kino.pub/addon.py", line 6, in <module>
                                                       plugin.run()
                                                     File "/storage/.kodi/addons/video.kino.pub/resources/lib/plugin.py", line 88, in run
                                                       self.routing.dispatch(self.path)
                                                     File "/storage/.kodi/addons/video.kino.pub/resources/lib/routing.py", line 71, in dispatch
                                                       view_func(**kwargs)
                                                     File "/storage/.kodi/addons/video.kino.pub/resources/lib/main.py", line 86, in login
                                                       plugin.auth.get_token()
                                                     File "/storage/.kodi/addons/video.kino.pub/resources/lib/auth.py", line 218, in get_token
                                                       self._activate()
                                                     File "/storage/.kodi/addons/video.kino.pub/resources/lib/auth.py", line 204, in _activate
                                                       resp = self._get_device_code()
                                                              ^^^^^^^^^^^^^^^^^^^^^^^
                                                     File "/storage/.kodi/addons/video.kino.pub/resources/lib/auth.py", line 127, in _get_device_code
                                                       resp = self._make_request(payload)
                                                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                                     File "/storage/.kodi/addons/video.kino.pub/resources/lib/auth.py", line 85, in _make_request
                                                       response = urllib.request.urlopen(
                                                                  ^^^^^^^^^^^^^^^^^^^^^^^
                                                     File "/usr/lib/python3.11/urllib/request.py", line 216, in urlopen
                                                     File "/usr/lib/python3.11/urllib/request.py", line 519, in open
                                                     File "/usr/lib/python3.11/urllib/request.py", line 536, in _open
                                                     File "/usr/lib/python3.11/urllib/request.py", line 496, in _call_chain
                                                     File "/usr/lib/python3.11/urllib/request.py", line 1391, in https_open
                                                     File "/usr/lib/python3.11/urllib/request.py", line 1351, in do_open
                                                   urllib.error.URLError: <urlopen error [Errno 104] Connection reset by peer>
                                                   -->End of Python script error report<--
quarckster commented 9 months ago

Спасибо за PR :heart:

quarckster commented 9 months ago

Ещё нужно разобраться с тестами, ни один не проходит.

nikolaev-rd commented 8 months ago

Ещё нужно разобраться с тестами, ни один не проходит.

Я вот даже не знаю, че с этими тестами. Это точно я сломал? Error: no pod with name or ID kodipod found: no such pod

quarckster commented 8 months ago

Ещё нужно разобраться с тестами, ни один не проходит.

Я вот даже не знаю, че с этими тестами. Это точно я сломал? Error: no pod with name or ID kodipod found: no such pod

С тестами всё нормально, вот недавний PR, в котором тесты прошли https://github.com/quarckster/kodi.kino.pub/pull/323

nikolaev-rd commented 8 months ago

На новом устройстве обнаружил еще место, где надо тоже добавить поддержку прокси (auth.py):

@quarckster смотрю как попроще сюда тоже добавить поддержку прокси, потому что иначе нельзя сделать активацию устройства, и ощущение что можно унаследовать KinoPubClient + подпилить потом часть методов в классе Auth. Иначе придется копипастить код для прокси, или выносить его еще куда-нить, чтобы потом в двух местах использовать.

Что скажешь?

nikolaev-rd commented 8 months ago

Ещё нужно разобраться с тестами, ни один не проходит.

Я вот даже не знаю, че с этими тестами. Это точно я сломал? Error: no pod with name or ID kodipod found: no such pod

С тестами всё нормально, вот недавний PR, в котором тесты прошли #323

Все логи забиты этой ошибкой:

2024-02-10 21:49:24.449 T:98      ERROR <general>: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
                                                    - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
                                                   Error Type: <class 'ModuleNotFoundError'>
                                                   Error Contents: No module named 'socks'
                                                   Traceback (most recent call last):
                                                     File "/home/kodi/.kodi/addons/video.kino.pub/addon.py", line 2, in <module>
                                                       from resources.lib.main import plugin
                                                     File "/home/kodi/.kodi/addons/video.kino.pub/resources/lib/main.py", line 17, in <module>
                                                       from resources.lib.plugin import Plugin
                                                     File "/home/kodi/.kodi/addons/video.kino.pub/resources/lib/plugin.py", line 18, in <module>
                                                       from resources.lib.client import KinoPubClient
                                                     File "/home/kodi/.kodi/addons/video.kino.pub/resources/lib/client.py", line 17, in <module>
                                                       import socks
                                                   ModuleNotFoundError: No module named 'socks'
                                                   -->End of Python script error report<--

@quarckster подскажи, где мне еще надо прописать этот модуль?

quarckster commented 8 months ago

@quarckster подскажи, где мне еще надо прописать этот модуль?

Необходимо сюда https://github.com/quarckster/kodi.kino.pub/tree/master/tests/data/addons положить этот плагин https://kodi.tv/addons/nexus/script.module.pysocks/

nikolaev-rd commented 8 months ago

Положил, но ошибка та же:

                                                     File "/home/kodi/.kodi/addons/video.kino.pub/resources/lib/client.py", line 17, in <module>
                                                       import socks
                                                   ModuleNotFoundError: No module named 'socks'
                                                   -->End of Python script error report<--
amironofff commented 8 months ago

У меня проблема, как в тикете 318. Поддержка кинопаба (очень добрые люди) отправила сюда. Я почитал эти тикеты, и как в меме "ничего не понял, но очень интересно". Есть где-нибудь инструкция как починить? Или нужно искать где-то прокси и просто прописывать его в настройках Kodi?

quarckster commented 8 months ago

У меня проблема, как в тикете 318. Поддержка кинопаба (очень добрые люди) отправила сюда. Я почитал эти тикеты, и как в меме "ничего не понял, но очень интересно". Есть где-нибудь инструкция как починить? Или нужно искать где-то прокси и просто прописывать его в настройках Kodi?

Поддержка прокси ещё не реализована. Постараюсь помочь с этим пулл реквестом.

amironofff commented 8 months ago

У меня проблема, как в тикете 318. Поддержка кинопаба (очень добрые люди) отправила сюда. Я почитал эти тикеты, и как в меме "ничего не понял, но очень интересно". Есть где-нибудь инструкция как починить? Или нужно искать где-то прокси и просто прописывать его в настройках Kodi?

Поддержка прокси ещё не реализована. Постараюсь помочь с этим пулл реквестом.

Спасибо огромное! Очень жду! Совсем недавно нашел как победить фризы через InputStream. И тут эта проблема. Спасибо заранее еще раз!

nikolaev-rd commented 8 months ago

@quarckster похоже тесты не проходят по коммитам от меня, а по твоим коммитам работают. Видимо чето с правами.

quarckster commented 8 months ago

@quarckster похоже тесты не проходят по коммитам от меня, а по твоим коммитам работают. Видимо чето с правами.

Там надо было подправить БД аддонов Kodi Addons33.db, я добавил pysocks, и тесты стали проходить.

quarckster commented 8 months ago

Я ещё потетсирую изменения у себя и хотел бы добавить тесты.

nikolaev-rd commented 8 months ago

Я ещё потетсирую изменения у себя и хотел бы добавить тесты.

На RPi2 и прокси через http (без авторизации) / socks (с авторизацией) я проверил — работает.

amironofff commented 8 months ago

У меня не заработало на SOCK4. Вот кусок лога - на сертификаты ругается: 2024-02-25 16:29:52.085 T:734 error : EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--

2024-02-25 16:29:52.202 T:733 error : GetDirectory - Error getting plugin://video.kino.pub/items/all/fresh/ 2024-02-25 16:29:52.218 T:559 error : CGUIMediaWindow::GetDirectory(plugin://video.kino.pub/items/all/fresh/) failed

nikolaev-rd commented 8 months ago

У меня не заработало на SOCK4. Вот кусок лога - на сертификаты ругается

Тут что-то с прокси — используется самоподписной сертификат, что все либы считают неправильным (я тут с ними согласен). Вот такой попробуй (чисто для теста, это рандомная прокся из интернетов): 103.148.57.103:30001 (SOCKS4)

amironofff commented 8 months ago

Попробовал с предложенным прокси - результат такой же, но есть отличие визуальное: после нажатие на кнопку "Закладки" ожидание сильно дольше до появления ошибки. В логах опять ругается на сертификат: _2024-02-25 23:14:34.241 T:745 error : GetDirectory - Error getting plugin://video.kino.pub/bookmarks/ 2024-02-25 23:14:34.250 T:546 error : CGUIMediaWindow::GetDirectory(plugin://video.kino.pub/bookmarks/) failed 2024-02-25 23:15:07.436 T:546 error : Control 55 in window 10025 has been asked to focus, but it can't 2024-02-25 23:15:49.925 T:793 error : EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--

И еще интересный момент - после проверки предложенного хоста с портом на все типы прокси, которые есть в Kodi, я выключил прокси и о чудо - все заработало. Проверил на "Закладки" - там провалился в папку и запустил фильм, и на "New", оттуда тоже фильм запустился.

nikolaev-rd commented 8 months ago

Попробовал с предложенным прокси - результат такой же, но есть отличие визуальное: после нажатие на кнопку "Закладки" ожидание сильно дольше до появления ошибки.

Странно, у меня работает (со второго раза запрос прошел, прокся эта рандомная — явно медленная, но всё же). В настройках так делал:

Type: SOCKS4A
Host: 103.148.57.103
Port: 30001

Опять же, советую купить где-нить прокси/vpn, чтобы не страдать с рандомными прокси из интернетов, где непонятно что на них с трафиком происходит потом.

Ошибка

urllib.error.URLError: <urlopen error [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1123)>

возникает в случаях, когда к http-прокси пытаются обращаться как к https-прокси (на самом деле там должен быть http + TLS), похоже тут всё тоже верно.

abdullasharapov commented 7 months ago

Подскажите по деталям. Все запросы к API теперь заворачиваются через прокси. А как дело обстоит с контентом? Контент тянется с другого адреса? Ну и в целом, использование прокси на системном уровне коди вероятно повлияет на то, что остальные приложения будут гонять трафик через проксю. Не рассматриваете возможность использования прокси лишь на уровне аддона, т.е. добавить соответствующий пункт в меню аддона?

nikolaev-rd commented 7 months ago

Подскажите по деталям. Все запросы к API теперь заворачиваются через прокси. А как дело обстоит с контентом? Контент тянется с другого адреса?

Да, видео/картинки стримятся напрямую, через прокси идут только запросы к API Кинопаба.

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

Такое возможно, но из моей практики — редко какой аддон умеет подхватывать системную прокси.

Не рассматриваете возможность использования прокси лишь на уровне аддона, т.е. добавить соответствующий пункт в меню аддона?

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