Skip to content

Commit 1115add

Browse files
authored
Merge pull request #103 from Day-Anger/matrix
fix(voidboost): handle both plain text and base64 stream formats
2 parents c07965f + ac444b8 commit 1115add

10 files changed

Lines changed: 116 additions & 19 deletions

File tree

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525
# run: echo "${{toJson(github)}}"
2626

2727
- name: Run make release
28-
run: cd $HOME/work/kodi/kodi/ && make release
28+
run: cd $GITHUB_WORKSPACE && make release
2929

3030
- uses: stefanzweifel/git-auto-commit-action@v4
3131
with:

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
|![](addons/zip/script.dandy.strm.marker/icon.png?raw=true)|STRM Marker|script.dandy.strm.marker|STRM Marker|[2.0.0](addons/zip/script.dandy.strm.marker/script.dandy.strm.marker-2.0.0.zip?raw=true)|`7d560c96ff9b08e2dec0add0db0409d2`|
88
|![](addons/zip/plugin.video.dandy.seasonvar.ru/icon.png?raw=true)|seasonvar.ru|plugin.video.dandy.seasonvar.ru|Seasovar.ru Kodi Video Addon|[2.0.9](addons/zip/plugin.video.dandy.seasonvar.ru/plugin.video.dandy.seasonvar.ru-2.0.9.zip?raw=true)|`b4137559b24671d1ee4ca9025bae1725`|
99
|![](addons/zip/context.dandy.kinopoisk.sc/icon.png?raw=true)|Kinopoisk Search Content|context.dandy.kinopoisk.sc|Kinopoisk Search Content|[3.0.1](addons/zip/context.dandy.kinopoisk.sc/context.dandy.kinopoisk.sc-3.0.1.zip?raw=true)|`2a42144752cbd501d988f7de1afee79f`|
10-
|![](addons/zip/plugin.video.hdrezka.tv/icon.png?raw=true)|Hdrezka.tv|plugin.video.hdrezka.tv|Hdrezka.tv|[3.2.4](addons/zip/plugin.video.hdrezka.tv/plugin.video.hdrezka.tv-3.2.4.zip?raw=true)|`35928977b63bfce21959bbadffdecb91`|
10+
|![](addons/zip/plugin.video.hdrezka.tv/icon.png?raw=true)|Hdrezka.tv|plugin.video.hdrezka.tv|Hdrezka.tv|[3.2.5](addons/zip/plugin.video.hdrezka.tv/plugin.video.hdrezka.tv-3.2.5.zip?raw=true)|`5fae038ff39c380103bce65e7f66a166`|
1111
|![](addons/zip/plugin.video.tivix.net/icon.png?raw=true)|Tivix.net|plugin.video.tivix.net|Tivix.net|[3.0.2](addons/zip/plugin.video.tivix.net/plugin.video.tivix.net-3.0.2.zip?raw=true)|`bd9dc61509274446032c7951739553e4`|
1212
|![](addons/zip/plugin.video.kinoprosmotr.net/icon.png?raw=true)|Kinoprosmotr.net|plugin.video.kinoprosmotr.net|Kinoprosmotr.net|[3.0.0](addons/zip/plugin.video.kinoprosmotr.net/plugin.video.kinoprosmotr.net-3.0.0.zip?raw=true)|`9eb73856fc321ce9e9337914e219212a`|
1313
|![](addons/zip/script.dandy.domain.manager/icon.png?raw=true)|Domain Manager|script.dandy.domain.manager|Domain Manager|[2.0.0](addons/zip/script.dandy.domain.manager/script.dandy.domain.manager-2.0.0.zip?raw=true)|`762fd48864965c1355cca7bf0c69a8d4`|

addons/addons.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,15 +199,15 @@
199199
</extension>
200200
</addon>
201201

202-
<addon id="plugin.video.hdrezka.tv" name="Hdrezka.tv" version="3.2.4" provider-name="MrStealth, dandy, DesSolo">
202+
<addon id="plugin.video.hdrezka.tv" name="Hdrezka.tv" version="3.2.5" provider-name="MrStealth, dandy, DesSolo">
203203
<requires>
204204
<import addon="xbmc.python" version="3.0.0"/>
205205
<import addon="script.module.xbmc.helpers" version="3.0.0"/>
206206
<import addon="script.module.translit" version="3.0.0"/>
207207
<import addon="script.module.dandy.search.history" version="3.0.0"/>
208208
<import addon="script.module.requests"/>
209209
</requires>
210-
<extension point="xbmc.python.pluginsource" provides="video" library="default.py">>
210+
<extension point="xbmc.python.pluginsource" provides="video" library="default.py">
211211
<provides>video</provides>
212212
</extension>
213213
<extension point="xbmc.addon.metadata">

addons/addons.xml.md5

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4d89ebf352829e822c7dad338194e6e7
1+
9fbf028c6f821aa6215cf51ac4ef3726

addons/plugin.video.hdrezka.tv/addon.xml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2-
<addon id="plugin.video.hdrezka.tv" name="Hdrezka.tv" version="3.2.4" provider-name="MrStealth, dandy, DesSolo">
2+
<addon id="plugin.video.hdrezka.tv" name="Hdrezka.tv" version="3.2.5" provider-name="MrStealth, dandy, DesSolo">
33
<requires>
44
<import addon="xbmc.python" version="3.0.0"/>
55
<import addon="script.module.xbmc.helpers" version="3.0.0"/>
66
<import addon="script.module.translit" version="3.0.0"/>
77
<import addon="script.module.dandy.search.history" version="3.0.0"/>
88
<import addon="script.module.requests"/>
99
</requires>
10-
<extension point="xbmc.python.pluginsource" provides="video" library="default.py">>
10+
<extension point="xbmc.python.pluginsource" provides="video" library="default.py">
1111
<provides>video</provides>
1212
</extension>
1313
<extension point="xbmc.addon.metadata">
@@ -21,4 +21,3 @@
2121
</assets>
2222
</extension>
2323
</addon>
24-

addons/plugin.video.hdrezka.tv/changelog.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
3.2.5
2+
[fix] voidboost obfuscation
3+
14
3.0.0
25
[upd] Kodi 19
36

Lines changed: 102 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import re
22
import base64
3+
import logging
34
from operator import itemgetter
5+
from typing import List, Tuple, Optional
6+
7+
logger = logging.getLogger(__name__)
48

59
BK_SEP = '//_//'
610
BK_BLOCKS = [
@@ -11,15 +15,102 @@
1115
'JCQjISFAIyFAIyM='
1216
]
1317

18+
# Компилируем один раз
19+
QUALITY_PATTERN = re.compile(r'\[((\d+)[^]]+)].+?(http.+?mp4)', re.DOTALL)
20+
21+
22+
def parse_streams(data: str) -> List[Tuple[str, int, str]]:
23+
"""
24+
Парсит потоки из обфусцированной или plain text строки.
25+
Сохраняет оригинальную логику: берет первый URL после качества.
26+
27+
Returns:
28+
[(quality_name, quality_int, url), ...] отсортировано по качеству desc
29+
30+
Raises:
31+
ValueError: Если нет валидных потоков
32+
"""
33+
if not isinstance(data, str) or not data.strip():
34+
raise ValueError("Input must be non-empty string")
35+
36+
# Шаг 1: Очистка (как в оригинале)
37+
cleaned = _clean_obfuscation(data)
38+
39+
# Шаг 2: Декодирование с автоопределением формата
40+
decoded = _decode(cleaned)
41+
if not decoded:
42+
raise ValueError("Failed to decode streams data")
43+
44+
# Шаг 3: Парсинг (оригинальная логика)
45+
streams = _parse_quality_blocks(decoded)
46+
47+
if not streams:
48+
logger.warning(f"No streams parsed from: {decoded[:200]}...")
49+
raise ValueError("No streams found in decoded data")
50+
51+
# Шаг 4: Сортировка (оригинальная)
52+
return sorted(streams, key=itemgetter(1), reverse=True)
53+
54+
55+
def _clean_obfuscation(data: str) -> str:
56+
"""Удаляет escape-символы и мусорные блоки."""
57+
result = data.replace('\\', '')
58+
for block in BK_BLOCKS:
59+
result = result.replace(BK_SEP + block, '')
60+
return result
61+
62+
63+
def _decode(data: str) -> Optional[str]:
64+
"""
65+
Определяет формат и декодирует.
66+
Plain text: начинается с [
67+
Base64: остальное
68+
"""
69+
# Plain text (новый формат без обфускации)
70+
if data.startswith('['):
71+
logger.debug("Detected plain text format")
72+
return data
73+
74+
# Base64 (старый формат)
75+
try:
76+
# Проверяем минимальную длину для base64
77+
if len(data) < 4:
78+
return None
79+
80+
decoded_bytes = base64.b64decode(data[2:])
81+
return decoded_bytes.decode('utf-8')
82+
except (ValueError, UnicodeDecodeError) as e:
83+
logger.debug(f"Base64 decode failed: {e}")
84+
return None
85+
86+
87+
def _parse_quality_blocks(decoded: str) -> List[Tuple[str, int, str]]:
88+
"""
89+
Парсит блоки [quality]url.
90+
Сохраняет оригинальное поведение: берет первый http...mp4 после [quality].
91+
"""
92+
streams = []
93+
94+
for match in QUALITY_PATTERN.finditer(decoded):
95+
quality_name = match.group(1) # "1080p" или "1080p Ultra"
96+
quality_num = int(match.group(2)) # 1080
97+
url = match.group(3) # http...mp4 (первый найденный после [quality])
98+
99+
# Валидация URL
100+
if _is_valid_url(url):
101+
# Очистка HLS-суффикса для совместимости
102+
clean_url = url.replace(':hls:manifest.m3u8', '')
103+
streams.append((quality_name, quality_num, clean_url))
104+
else:
105+
logger.warning(f"Invalid URL parsed: {url[:100]}...")
106+
107+
return streams
108+
14109

15-
def parse_streams(salted):
16-
salted = salted.replace('\\', '')
17-
for bk in BK_BLOCKS:
18-
salted = salted.replace(BK_SEP + bk, '')
19-
decoded_streams = base64.b64decode(salted[2:]).decode('utf-8')
20-
parsed_streams = []
21-
for name, quality, url in re.findall(r'\[((\d+)[^]]+)].+?(http.+?mp4)', decoded_streams):
22-
parsed_streams.append((
23-
name, int(quality), url
24-
))
25-
return sorted(parsed_streams, key=itemgetter(1), reverse=True)
110+
def _is_valid_url(url: str) -> bool:
111+
"""Проверяет что URL начинается с http и содержит домен."""
112+
return (
113+
url.startswith(('http://', 'https://')) and
114+
len(url) > 10 and
115+
'.' in url[8:] # после http:// или https://
116+
)

addons/zip/plugin.video.hdrezka.tv/changelog.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
3.2.5
2+
[fix] voidboost obfuscation
3+
14
3.0.0
25
[upd] Kodi 19
36

Binary file not shown.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
5fae038ff39c380103bce65e7f66a166

0 commit comments

Comments
 (0)