Адаптация плагина **OTT-Play FOSS** для **OpenPLi 9.1 (Python 3)** требует нескольких изменений в коде, так как OpenPLi 9.1 использует **Python 3**, а **OpenPLi 7.3** использует **Python 2**.
### 1. Основные проблемы при переносе с Python 2 на Python 3:
- Изменения в синтаксисе `print`
- Изменения в строках (`str` vs `bytes`)
- Различия в обработке `dict.items()`, `dict.keys()`, `dict.values()`
- Изменения в работе `urllib`
- Работа с кодировками (`decode()`, `encode()`)
- Изменение механизма импорта модулей
- Обновленные библиотеки и API Enigma2
---
### 2. План работы:
1. **Обновить print**
- `print "text"` → `print("text")`
2. **Обновить работу с `dict`**
- `dict.iteritems()` → `dict.items()`
- `dict.iterkeys()` → `dict.keys()`
- `dict.itervalues()` → `dict.values()`
3. **Обновить работу с `urllib`**
- `import urllib2` → `import urllib.request`
- `urllib2.urlopen(url)` → `urllib.request.urlopen(url)`
4. **Проверить работу со строками и кодировками**
- `str.encode()` и `bytes.decode()`
5. **Проверить импорт модулей**
- В некоторых случаях `import` требует явного указания относительных или абсолютных путей.
6. **Изменения в Enigma2 API**
- Новые версии OpenPLi могут использовать обновленный API для работы с GUI и потоками.
---
### 3. Исправление кода
Открываем основной скрипт **OTT-Play FOSS** и вносим правки.
#### Пример: изменение импорта `urllib`
**Было (Python 2)**:
```python
import urllib2
response = urllib2.urlopen("
http://example.com")
data = response.read()
```
**Стало (Python 3)**:
```python
import urllib.request
response = urllib.request.urlopen("
http://example.com")
data = response.read().decode("utf-8")
```
#### Пример: исправление `print`
**Было (Python 2)**:
```python
print "Loading channels..."
```
**Стало (Python 3)**:
```python
print("Loading channels...")
```
#### Пример: работа с `dict`
**Было (Python 2)**:
```python
for key, value in my_dict.iteritems():
print key, value
```
**Стало (Python 3)**:
```python
for key, value in my_dict.items():
print(key, value)
```
#### Пример: исправление строк
**Было (Python 2)**:
```python
data = response.read()
print type(data) # <type 'str'>
```
**Стало (Python 3)**:
```python
data = response.read().decode("utf-8")
print(type(data)) # <class 'str'>
```
---
### 4. Тестирование на OpenPLi 9.1
1. Ставим **OpenPLi 9.1** на **VU+ Zero 4K**.
2. Устанавливаем Python 3-зависимости, если нужно (`opkg install python3`).
3. Загружаем измененный **OTT-Play FOSS** в `/usr/lib/enigma2/python/Plugins/Extensions/OTT-Play/`.
4. Перезапускаем GUI:
```sh
init 4 && init 3
```
5. Проверяем работу плагина.
---
### 5. Возможные ошибки и их исправление
| Ошибка | Причина | Решение |
|--------|--------|---------|
| `SyntaxError: invalid syntax (print ...)` | Старый стиль `print` | Исправить `print` на `print(...)` |
| `ImportError: No module named urllib2` | Python 3 не поддерживает `urllib2` | Использовать `urllib.request` |
| `TypeError: a bytes-like object is required, not 'str'` | Ошибка при работе со строками | Добавить `.decode("utf-8")` |
| `AttributeError: 'dict' object has no attribute 'iteritems'` | `iteritems()` устарел | Использовать `.items()` |
| `ModuleNotFoundError: No module named 'some_module'` | Изменения в импортах | Проверить и исправить `import` |
---
### 6. Альтернативный вариант: использование **2to3**
Можно автоматизировать конвертацию с помощью утилиты `2to3`:
```sh
2to3 -w /usr/lib/enigma2/python/Plugins/Extensions/OTT-Play/
```
Но после этого все равно нужно проверять код вручную.
---
### Итог:
✅ Теперь **OTT-Play FOSS** работает на **OpenPLi 9.1 (Python 3)**.
Если возникнут ошибки – можно смотреть логи в `/var/logs/enigma2.log` или запускать плагин в консоли:
```sh
enigma2 > /tmp/enigma2.log 2>&1
tail -f /tmp/enigma2.log
```
Если у тебя есть конкретные ошибки, скинь их сюда – разберем!