💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 fix(profile): allow top-level hostlist suffixes
👤 Автор: loop-uh
🔗 SHA:
📊 Статистика: 2 files changed, 12 insertions(+), 3 deletions(-)
📁 Изменённые файлы:
✏️
✏️
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 fix(profile): allow top-level hostlist suffixes
👤 Автор: loop-uh
🔗 SHA:
5232c3c📊 Статистика: 2 files changed, 12 insertions(+), 3 deletions(-)
📁 Изменённые файлы:
✏️
src/profile/list_file_editor.py✏️
tests/test_profile_list_file_editor.py🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 Проверить командную сборку установщика
👤 Автор: loop-uh
📅 Дата: 24.07.2026 11:30:00
🔗 SHA:
📊 Статистика:
➕ Добавлено: 130 строк
➖ Удалено: 2 строк
📝 Всего изменений: 132
📁 Изменено файлов: 1
✏️
+130 -2
Удалилось:
Добавилось:
... и еще 108 строк
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 Проверить командную сборку установщика
👤 Автор: loop-uh
📅 Дата: 24.07.2026 11:30:00
🔗 SHA:
6a7bd34📊 Статистика:
➕ Добавлено: 130 строк
➖ Удалено: 2 строк
📝 Всего изменений: 132
📁 Изменено файлов: 1
✏️
tests/test_build_resource_layout.py+130 -2
Удалилось:
self.assertIn('self.build_method_var = tk.StringVar(value="nuitka")', gui)self.assertIn('default="nuitka"', cli)Добавилось:
import json
self.assertIn('DEFAULT_BUILD_METHOD = "nuitka"', gui)self.assertIn('self.build_method_var = tk.StringVar(value=DEFAULT_BUILD_METHOD)', gui)self.assertIn("default=DEFAULT_BUILD_METHOD", cli)with patch.object(
build_release_cli,
"check_telegram_configured",
return_value=(True, "Telegram настроен"),
):
defaults = build_release_cli.parse_args(
... и еще 108 строк
🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 Проверить выбор следующей версии выпуска
👤 Автор: loop-uh
📅 Дата: 24.07.2026 14:00:14
🔗 SHA:
📊 Статистика:
➕ Добавлено: 50 строк
➖ Удалено: 0 строк
📝 Всего изменений: 50
📁 Изменено файлов: 1
✏️
+50 -0
Добавилось:
... и еще 37 строк
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 Проверить выбор следующей версии выпуска
👤 Автор: loop-uh
📅 Дата: 24.07.2026 14:00:14
🔗 SHA:
a540dd6📊 Статистика:
➕ Добавлено: 50 строк
➖ Удалено: 0 строк
📝 Всего изменений: 50
📁 Изменено файлов: 1
✏️
tests/test_build_resource_layout.py+50 -0
Добавилось:
self.assertTrue(defaults.version_is_explicit)
def test_cli_defaults_to_dev_and_increments_fourth_version_part_independently(self) -> None:
build_path = PRIVATE_ROOT / "build_zapret"
old_path = list(sys.path)
sys.path.insert(0, str(build_path))
try:
sys.modules.pop("build_release_cli", None)import build_release_cli
with tempfile.TemporaryDirectory() as temp_dir:
versions_file = Path(temp_dir) / "version_Local.json"
... и еще 37 строк
🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 Скрыть окна команд выпуска
👤 Автор: loop-uh
📅 Дата: 24.07.2026 14:07:49
🔗 SHA:
📊 Статистика:
➕ Добавлено: 31 строк
➖ Удалено: 0 строк
📝 Всего изменений: 31
📁 Изменено файлов: 1
✏️
+31 -0
Добавилось:
... и еще 17 строк
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 Скрыть окна команд выпуска
👤 Автор: loop-uh
📅 Дата: 24.07.2026 14:07:49
🔗 SHA:
3339f5b📊 Статистика:
➕ Добавлено: 31 строк
➖ Удалено: 0 строк
📝 Всего изменений: 31
📁 Изменено файлов: 1
✏️
tests/test_build_resource_layout.py+31 -0
Добавилось:
def test_scheduled_release_task_is_registered_without_console_window(self) -> None:
registration = (
PRIVATE_ROOT / "register_release_task.ps1"
).read_text(encoding="utf-8")
readme = (
PRIVATE_ROOT / "build_zapret" / "README.md"
).read_text(encoding="utf-8")
self.assertIn("'pythonw.exe'", registration)self.assertIn("-m build_zapret.scheduled_release_task", registration)self.assertIn("-WorkingDirectory $PrivateRoot", registration)... и еще 17 строк
🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 Проверить скрытый вывод публикации
👤 Автор: loop-uh
📅 Дата: 24.07.2026 14:15:52
🔗 SHA:
📊 Статистика:
➕ Добавлено: 1 строк
➖ Удалено: 0 строк
📝 Всего изменений: 1
📁 Изменено файлов: 1
✏️
+1 -0
Добавилось:
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 Проверить скрытый вывод публикации
👤 Автор: loop-uh
📅 Дата: 24.07.2026 14:15:52
🔗 SHA:
d408c9a📊 Статистика:
➕ Добавлено: 1 строк
➖ Удалено: 0 строк
📝 Всего изменений: 1
📁 Изменено файлов: 1
✏️
tests/test_build_resource_layout.py+1 -0
Добавилось:
self.assertNotIn("capture_output=True,\n text=True,\n creationflags", ssh)🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 Закрепить единый конвейер сборки GUI и CLI
👤 Автор: loop-uh
📅 Дата: 24.07.2026 14:40:43
🔗 SHA:
📊 Статистика:
➕ Добавлено: 309 строк
➖ Удалено: 138 строк
📝 Всего изменений: 447
📁 Изменено файлов: 1
✏️
+309 -138
Удалилось:
... и еще 125 строк
Добавилось:
... и еще 288 строк
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 Закрепить единый конвейер сборки GUI и CLI
👤 Автор: loop-uh
📅 Дата: 24.07.2026 14:40:43
🔗 SHA:
7f36263📊 Статистика:
➕ Добавлено: 309 строк
➖ Удалено: 138 строк
📝 Всего изменений: 447
📁 Изменено файлов: 1
✏️
tests/test_build_resource_layout.py+309 -138
Удалилось:
self.assertIn('DEFAULT_BUILD_METHOD = "nuitka"', gui)self.assertIn("Запуск из исходников запрещён", gui)self.assertIn("Запуск приложения из исходников запрещён", cli)build_path = PRIVATE_ROOT / "build_zapret"
sys.path.insert(0, str(build_path))
sys.modules.pop("build_release_cli", None)import build_release_cli
defaults = build_release_cli.parse_args(
parsed = build_release_cli.parse_args(
options = build_release_cli.BuildOptions(
... и еще 125 строк
Добавилось:
@staticmethod
def _release_request(release_model, **overrides):
values = {"channel": "dev",
"version": "1.2.3.4",
"notes": "test",
"build_method": "nuitka",
"fast_exe": False,
"fast_exe_dest": None,
"publish_telegram": False,
... и еще 288 строк
🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 Исправить замену верхней панели окна
👤 Автор: loop-uh
📅 Дата: 24.07.2026 15:02:14
🔗 SHA:
📊 Статистика:
➕ Добавлено: 28 строк
➖ Удалено: 0 строк
📝 Всего изменений: 28
📁 Изменено файлов: 2
✏️
+14 -0
Добавилось:
... и еще 1 строк
✏️
+14 -0
Добавилось:
... и еще 1 строк
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 Исправить замену верхней панели окна
👤 Автор: loop-uh
📅 Дата: 24.07.2026 15:02:14
🔗 SHA:
7885568📊 Статистика:
➕ Добавлено: 28 строк
➖ Удалено: 0 строк
📝 Всего изменений: 28
📁 Изменено файлов: 2
✏️
src/ui/fluent_app_window.py+14 -0
Добавилось:
def setTitleBar(self, title_bar) -> None: # noqa: N802 (qfluentwidgets API)
"""Безопасно заменяет верхнюю панель окна.
qframelesswindow регистрирует каждую TitleBar как фильтр событий окна,
но при замене только откладывает её удаление. На Python 3.14 / PyQt6
6.11 старая панель иногда успевает получить WindowStateChange уже во
время очистки Python-объекта, когда maxBtn в нём больше нет.
"""
previous_title_bar = getattr(self, "titleBar", None)
if previous_title_bar is not None and previous_title_bar is not title_bar:
self.removeEventFilter(previous_title_bar)
... и еще 1 строк
✏️
tests/test_fluent_app_window_chrome.py+14 -0
Добавилось:
def test_replaced_titlebar_is_removed_from_window_event_filters(self) -> None:
class EventFilterTrackingWindow(ZapretFluentWindow):
def removeEventFilter(self, event_filter) -> None: # noqa: N802
detached = self.__dict__.setdefault("_detached_event_filters", [])detached.append(event_filter)
super().removeEventFilter(event_filter)
window = EventFilterTrackingWindow()
detached = window.__dict__.get("_detached_event_filters", [])self.assertGreaterEqual(len(detached), 1)
self.assertNotIn(window.titleBar, detached)
... и еще 1 строк
🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 Закрепить актуальные версии библиотек
👤 Автор: loop-uh
📅 Дата: 24.07.2026 15:19:28
🔗 SHA:
📊 Статистика:
➕ Добавлено: 124 строк
➖ Удалено: 61 строк
📝 Всего изменений: 185
📁 Изменено файлов: 9
✏️
+1 -1
Удалилось:
Добавилось:
🆕
+7 -0
Добавилось:
🆕
+4 -0
Добавилось:
🆕
+6 -0
Добавилось:
🆕
+26 -0
Добавилось:
... и еще 12 строк
✏️
+9 -56
Удалилось:
... и еще 37 строк
Добавилось:
✏️
+5 -0
Добавилось:
✏️
+5 -4
Удалилось:
Добавилось:
... и еще 1 файлов
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 Закрепить актуальные версии библиотек
👤 Автор: loop-uh
📅 Дата: 24.07.2026 15:19:28
🔗 SHA:
4982868📊 Статистика:
➕ Добавлено: 124 строк
➖ Удалено: 61 строк
📝 Всего изменений: 185
📁 Изменено файлов: 9
✏️
.github/workflows/windows-release.yml+1 -1
Удалилось:
python -m pip install nuitka pyinstaller PyQt6 PyQt6-Qt6 PyQt6-sip pywin32 psutil requests urllib...
Добавилось:
python -m pip install --upgrade --upgrade-strategy eager -r requirements-build.txt
🆕
requirements-build.txt+7 -0
Добавилось:
# Каноническое окружение сборки runtime.
# Этот файл устанавливает действующий GitHub Actions workflow.
-r requirements-runtime.txt
PyInstaller==6.21.0
Nuitka==4.1.3
🆕
requirements-dev.txt+4 -0
Добавилось:
# Инструменты разработки, тестов и генерации ресурсов.
pytest==9.1.1
simplepycons==1!16.27.0
🆕
requirements-publish.txt+6 -0
Добавилось:
# Инструменты публикации выпуска.
PyGithub==2.9.1
paramiko==5.0.0
Pyrogram==2.0.106
Telethon==1.44.0
🆕
requirements-runtime.txt+26 -0
Добавилось:
# Библиотеки, которые использует приложение и которые попадают в runtime.
# Последняя сверка с PyPI: 2026-07-24.
# GUI
PyQt6==6.11.0
PyQt6-Qt6==6.11.1
PyQt6-sip==13.11.1
PyQt6-Fluent-Widgets==1.11.2
PyQt6-Frameless-Window==0.8.1
QtAwesome==1.4.2
# Сеть и HTTP
... и еще 12 строк
✏️
requirements.txt+9 -56
Удалилось:
# requirements.txt — Zapret GUI
# "C:\Program Files\Python314\Scripts\pip.exe" install -r requirements.txt
# python.exe -m pip install --upgrade pip
# ════════════════════════════════════════════════════════════
# Runtime (попадает в exe — это же ставит CI в windows-release.yml)
# ════════════════════════════════════════════════════════════
# GUI Framework
PyQt6
PyQt6-Qt6
PyQt6-sip
... и еще 37 строк
Добавилось:
# Полное окружение разработки и выпуска ZapretGUI.
# Версии пакетов находятся только в профильных файлах ниже.
#
# Установка на Windows:
# py -3.14 -m pip install --upgrade --upgrade-strategy eager -r requirements.txt
-r requirements-build.txt
-r requirements-publish.txt
-r requirements-dev.txt
✏️
tests/test_build_resource_layout.py+5 -0
Добавилось:
self.assertIn(
"python -m pip install --upgrade --upgrade-strategy eager -r requirements-build.txt",
workflow,
)
self.assertNotIn("pip install nuitka pyinstaller", workflow.lower())✏️
tests/test_crypto_dependency_trim.py+5 -4
Удалилось:
checked_paths = [ROOT / "requirements.txt", ROOT / ".github" / "workflows" / "windows-release.yml"]
requirements = (ROOT / "requirements.txt").read_text(encoding="utf-8")
self.assertIn("tgcrypto", requirements)self.assertIn("tgcrypto", workflow)Добавилось:
checked_paths = list(ROOT.glob("requirements*.txt"))checked_paths.append(ROOT / ".github" / "workflows" / "windows-release.yml")
runtime_requirements = (ROOT / "requirements-runtime.txt").read_text(encoding="utf-8")
self.assertIn("TgCrypto==1.2.5", runtime_requirements)self.assertIn("-r requirements-build.txt", workflow)... и еще 1 файлов
🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 Исправить публичную Windows-сборку без закрытого значка
👤 Автор: loop-uh
📅 Дата: 24.07.2026 15:23:47
🔗 SHA:
📊 Статистика:
➕ Добавлено: 2 строк
➖ Удалено: 2 строк
📝 Всего изменений: 4
📁 Изменено файлов: 2
✏️
+0 -2
Удалилось:
✏️
+2 -0
Добавилось:
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 Исправить публичную Windows-сборку без закрытого значка
👤 Автор: loop-uh
📅 Дата: 24.07.2026 15:23:47
🔗 SHA:
e485607📊 Статистика:
➕ Добавлено: 2 строк
➖ Удалено: 2 строк
📝 Всего изменений: 4
📁 Изменено файлов: 2
✏️
.github/workflows/windows-release.yml+0 -2
Удалилось:
"--windows-icon-from-ico=src\ico\Zapret2.ico",
"--icon", "src\ico\Zapret2.ico",
✏️
tests/test_build_resource_layout.py+2 -0
Добавилось:
self.assertNotIn(r"src\ico", workflow)
self.assertNotIn("--windows-icon-from-ico", workflow)🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 Исправить жизненный цикл fluent-диалогов
👤 Автор: loop-uh
📅 Дата: 24.07.2026 16:10:05
🔗 SHA:
📊 Статистика:
➕ Добавлено: 180 строк
➖ Удалено: 21 строк
📝 Всего изменений: 201
📁 Изменено файлов: 21
✏️
+2 -1
Удалилось:
Добавилось:
✏️
+2 -1
Удалилось:
Добавилось:
✏️
+2 -1
Удалилось:
Добавилось:
✏️
+2 -1
Удалилось:
Добавилось:
✏️
+1 -1
Удалилось:
Добавилось:
✏️
+1 -1
Удалилось:
Добавилось:
✏️
+1 -1
Удалилось:
Добавилось:
✏️
+1 -1
Удалилось:
Добавилось:
✏️
+1 -2
Удалилось:
Добавилось:
✏️
+2 -1
Удалилось:
Добавилось:
... и еще 11 файлов
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 Исправить жизненный цикл fluent-диалогов
👤 Автор: loop-uh
📅 Дата: 24.07.2026 16:10:05
🔗 SHA:
e73221d📊 Статистика:
➕ Добавлено: 180 строк
➖ Удалено: 21 строк
📝 Всего изменений: 201
📁 Изменено файлов: 21
✏️
src/dns/ui/custom_dns_dialog.py+2 -1
Удалилось:
from qfluentwidgets import BodyLabel, CaptionLabel, LineEdit, MessageBoxBase, SubtitleLabel
Добавилось:
from qfluentwidgets import BodyLabel, CaptionLabel, LineEdit, SubtitleLabel
from ui.fluent_dialog import MessageBoxBase
✏️
src/dns/ui/page.py+2 -1
Удалилось:
InfoBarPosition, LineEdit, MessageBox, PushButton, RoundMenu, SettingCardGroup, StrongBodyLabel,
Добавилось:
InfoBarPosition, LineEdit, PushButton, RoundMenu, SettingCardGroup, StrongBodyLabel,
from ui.fluent_dialog import MessageBox
✏️
src/donater/ui/page.py+2 -1
Удалилось:
from qfluentwidgets import BodyLabel, InfoBar, MessageBox, SubtitleLabel
Добавилось:
from qfluentwidgets import BodyLabel, InfoBar, SubtitleLabel
from ui.fluent_dialog import MessageBox
✏️
src/hosts/ui/page.py+2 -1
Удалилось:
BodyLabel, CaptionLabel, ComboBox, InfoBar, MessageBox, PushButton,
Добавилось:
BodyLabel, CaptionLabel, ComboBox, InfoBar, PushButton,
from ui.fluent_dialog import MessageBox
✏️
src/main/post_startup_host.py+1 -1
Удалилось:
from qfluentwidgets import MessageBox
Добавилось:
from ui.fluent_dialog import MessageBox
✏️
src/orchestra/ui/blocked_page.py+1 -1
Удалилось:
MessageBox,
Добавилось:
from ui.fluent_dialog import MessageBox
✏️
src/orchestra/ui/locked_page.py+1 -1
Удалилось:
MessageBox,
Добавилось:
from ui.fluent_dialog import MessageBox
✏️
src/orchestra/ui/whitelist_page.py+1 -1
Удалилось:
MessageBox,
Добавилось:
from ui.fluent_dialog import MessageBox
✏️
src/presets/ui/common/preset_subpage_base.py+1 -2
Удалилось:
MessageBox,
MessageBoxBase,
Добавилось:
from ui.fluent_dialog import MessageBox, MessageBoxBase
✏️
src/presets/ui/common/user_presets_dialogs.py+2 -1
Удалилось:
from qfluentwidgets import BodyLabel, CaptionLabel, LineEdit, MessageBoxBase, SubtitleLabel
Добавилось:
from qfluentwidgets import BodyLabel, CaptionLabel, LineEdit, SubtitleLabel
from ui.fluent_dialog import MessageBoxBase
... и еще 11 файлов
🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 fix(profile): allow top-level hostlist suffixes
👤 Автор: loop-uh
📅 Дата: 25.07.2026 13:40:14
🔗 SHA:
📊 Статистика:
➕ Добавлено: 12 строк
➖ Удалено: 3 строк
📝 Всего изменений: 15
📁 Изменено файлов: 2
✏️
+4 -3
Удалилось:
Добавилось:
✏️
+8 -0
Добавилось:
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 fix(profile): allow top-level hostlist suffixes
👤 Автор: loop-uh
📅 Дата: 25.07.2026 13:40:14
🔗 SHA:
5232c3c📊 Статистика:
➕ Добавлено: 12 строк
➖ Удалено: 3 строк
📝 Всего изменений: 15
📁 Изменено файлов: 2
✏️
src/profile/list_file_editor.py+4 -3
Удалилось:
if len(ascii_domain) > 253 or "." not in ascii_domain:
if len(labels) < 2:
return False
Добавилось:
if len(ascii_domain) > 253:
# Оригинальный nfqws2 ищет hostname по суффиксам:
# www.example.ru -> example.ru -> ru. Поэтому одиночная DNS-метка вроде
# ru или su — допустимая и осмысленная запись hostlist.
✏️
tests/test_profile_list_file_editor.py+8 -0
Добавилось:
def test_hostlist_accepts_single_label_suffixes_supported_by_nfqws2(self) -> None:
invalid = validate_profile_list_file_text(
"hostlist",
"ru\nsu\n",
)
self.assertEqual(invalid, ())
🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 Централизовать theme-подписки qfluentwidgets и укрепить сайдбар
👤 Автор: loop-uh
🔗 SHA:
📊 Статистика: 15 files changed, 581 insertions(+), 33 deletions(-)
📁 Изменённые файлы:
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
🆕
✏️
✏️
✏️
✏️
🆕
✏️
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 Централизовать theme-подписки qfluentwidgets и укрепить сайдбар
👤 Автор: loop-uh
🔗 SHA:
b3fc3fb📊 Статистика: 15 files changed, 581 insertions(+), 33 deletions(-)
📁 Изменённые файлы:
✏️
src/blockcheck/dns_integrity.py✏️
src/hosts/proxy_domains.py✏️
src/main/qt_runtime.py✏️
src/main/window_lifecycle_cleanup.py✏️
src/startup/check_start.py✏️
src/ui/navigation/sidebar_builder.py✏️
src/ui/navigation/sidebar_intent.py✏️
src/ui/presets_menu/common.py🆕
src/ui/qfluent_signal_guards.py✏️
src/ui/theme_refresh.py✏️
src/updater/update.py✏️
tests/test_build_resource_layout.py✏️
tests/test_preset_sidebar_navigation.py🆕
tests/test_qfluent_signal_guards.py✏️
tests/test_sidebar_intent_persistence.py🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 Централизовать theme-подписки qfluentwidgets и укрепить сайдбар
👤 Автор: loop-uh
📅 Дата: 25.07.2026 14:42:53
🔗 SHA:
📊 Статистика:
➕ Добавлено: 581 строк
➖ Удалено: 33 строк
📝 Всего изменений: 614
📁 Изменено файлов: 15
✏️
+2 -0
Добавилось:
✏️
+2 -2
Удалилось:
Добавилось:
✏️
+8 -0
Добавилось:
✏️
+8 -4
Удалилось:
Добавилось:
✏️
+1 -0
Добавилось:
✏️
+52 -9
Удалилось:
Добавилось:
... и еще 39 строк
... и еще 9 файлов
... и еще 5 файлов
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 Централизовать theme-подписки qfluentwidgets и укрепить сайдбар
👤 Автор: loop-uh
📅 Дата: 25.07.2026 14:42:53
🔗 SHA:
b3fc3fb📊 Статистика:
➕ Добавлено: 581 строк
➖ Удалено: 33 строк
📝 Всего изменений: 614
📁 Изменено файлов: 15
✏️
src/blockcheck/dns_integrity.py+2 -0
Добавилось:
from __future__ import annotations
✏️
src/hosts/proxy_domains.py+2 -2
Удалилось:
_log(f"Не удалось разобрать {_CATALOG_FILE_NAME}: {exc}", "WARNING")_log(f"{_CATALOG_FILE_NAME} должен содержать JSON-объект", "WARNING")Добавилось:
_log(f"Не удалось разобрать hosts-каталог: {exc}", "WARNING")_log("hosts-каталог должен содержать JSON-объект", "WARNING")✏️
src/main/qt_runtime.py+8 -0
Добавилось:
t_signal_guards = _time.perf_counter()
from ui.qfluent_signal_guards import install_qfluent_theme_signal_guards
install_qfluent_theme_signal_guards()
emit_startup_metric(
"StartupQtThemeSignalGuards",
f"{(_time.perf_counter() - t_signal_guards) * 1000:.0f}ms",)
✏️
src/main/window_lifecycle_cleanup.py+8 -4
Удалилось:
"""Синхронно дозаписывает намерение сайдбара, не успевшее уйти через воркер.
воркеру и его reschedule-таймеру завершиться, поэтому pending-значение
пишется здесь напрямую — как и геометрия окна.
controller.mark_saved(bool(pending))
Добавилось:
"""Синхронно записывает намерение сайдбара при выходе.
воркеру и его reschedule-таймеру завершиться, поэтому значение пишется
здесь напрямую — как и геометрия окна. Запись выполняется даже если воркер
отчитался об успехе (его сигналу не доверяем — потеря стоила бы состояния
панели); повторные вызовы в той же цепочке выхода дедуплицируются через
mark_flushed.
controller.mark_flushed(bool(pending))
log(f"[SIDEBAR] flush при {context}: expanded={bool(pending)}", "INFO")✏️
src/startup/check_start.py+1 -0
Добавилось:
import ctypes
✏️
src/ui/navigation/sidebar_builder.py+52 -9
Удалилось:
from ui.navigation.sidebar_intent import DEFAULT_EXPAND_THRESHOLD, SidebarIntentController
on_failed=lambda _request_id, error: log(f"Не удалось сохранить состояние сайдбара: {error}", "DE...if _read_saved_sidebar_expanded():
if _window_width(window) < _sidebar_expand_threshold(window):
window_width=_window_width(window),
def reapply_sidebar_intent_on_resize(window) -> None:
return
return
return
Добавилось:
from ui.navigation.sidebar_intent import (
DEFAULT_EXPAND_THRESHOLD,
SidebarIntentController,
normalize_display_mode_name,
)
SIDEBAR_INTENT_RECHECK_AFTER_INIT_MS = 1500
on_failed=lambda _request_id, error: log(f"Не удалось сохранить состояние сайдбара: {error}", "WA...log(f"[SIDEBAR] состояние сохранено воркером: expanded={bool(saved_expanded)}", "INFO")saved = _read_saved_sidebar_expanded()
width = _window_width(window)
... и еще 39 строк
... и еще 9 файлов
... и еще 5 файлов
🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 Исправить программное сворачивание сайдбара и закрытие диалогов
👤 Автор: loop-uh
🔗 SHA:
📊 Статистика: 6 files changed, 233 insertions(+), 50 deletions(-)
📁 Изменённые файлы:
✏️
✏️
✏️
✏️
✏️
✏️
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 Исправить программное сворачивание сайдбара и закрытие диалогов
👤 Автор: loop-uh
🔗 SHA:
8f1252e📊 Статистика: 6 files changed, 233 insertions(+), 50 deletions(-)
📁 Изменённые файлы:
✏️
src/ui/fluent_dialog.py✏️
src/ui/navigation/sidebar_builder.py✏️
src/ui/navigation/sidebar_intent.py✏️
tests/test_fluent_dialog_lifecycle.py✏️
tests/test_preset_sidebar_navigation.py✏️
tests/test_sidebar_intent_persistence.py🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 Исправить изоляцию Qt-тестов и Linux-пропуски
👤 Автор: loop-uh
🔗 SHA:
📊 Статистика: 7 files changed, 125 insertions(+), 14 deletions(-)
📁 Изменённые файлы:
✏️
✏️
✏️
✏️
✏️
✏️
✏️
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 Исправить изоляцию Qt-тестов и Linux-пропуски
👤 Автор: loop-uh
🔗 SHA:
7d3b2c5📊 Статистика: 7 files changed, 125 insertions(+), 14 deletions(-)
📁 Изменённые файлы:
✏️
tests/conftest.py✏️
tests/test_dns_adapter_filtering.py✏️
tests/test_dns_core_winapi.py✏️
tests/test_launch_conflicting_processes.py✏️
tests/test_process_probe_ctypes_isolation.py✏️
tests/test_startup_install_path_checks.py✏️
tests/test_updater_installer_launch.py🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 Архитектурно связать состояние сайдбара с действием пользователя
👤 Автор: loop-uh
🔗 SHA:
📊 Статистика: 7 files changed, 195 insertions(+), 37 deletions(-)
📁 Изменённые файлы:
✏️
✏️
✏️
✏️
✏️
✏️
✏️
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 Архитектурно связать состояние сайдбара с действием пользователя
👤 Автор: loop-uh
🔗 SHA:
3f745fd📊 Статистика: 7 files changed, 195 insertions(+), 37 deletions(-)
📁 Изменённые файлы:
✏️
src/ui/fluent_dialog.py✏️
src/ui/navigation/sidebar_builder.py✏️
src/ui/navigation/sidebar_intent.py✏️
src/ui/window_ui_session.py✏️
tests/test_fluent_dialog_lifecycle.py✏️
tests/test_preset_sidebar_navigation.py✏️
tests/test_sidebar_intent_persistence.py🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 Перевести обновление на поэтапный конвейер
👤 Автор: loop-uh
🔗 SHA:
📊 Статистика: 22 files changed, 1441 insertions(+), 792 deletions(-)
📁 Изменённые файлы:
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
🆕
✏️
✏️
✏️
✏️
✏️
✏️
✏️
🆕
✏️
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 Перевести обновление на поэтапный конвейер
👤 Автор: loop-uh
🔗 SHA:
771322e📊 Статистика: 22 files changed, 1441 insertions(+), 792 deletions(-)
📁 Изменённые файлы:
✏️
src/app/feature_facades/updater.py✏️
src/ui/page_composition.py✏️
src/ui/page_deps/system.py✏️
src/ui/page_deps/types.py✏️
src/updater/commands.py✏️
src/updater/github_release.py✏️
src/updater/public.py✏️
src/updater/release_manager.py✏️
src/updater/retry_workers.py✏️
src/updater/startup_update_check.py✏️
src/updater/update.py✏️
src/updater/update_page_runtime.py🆕
src/updater/update_pipeline.py✏️
tests/test_preset_profile_async_architecture.py✏️
tests/test_server_status_worker_contract.py✏️
tests/test_update_check_coordinator.py✏️
tests/test_updater_cleanup_source_contract.py✏️
tests/test_updater_download_contract.py✏️
tests/test_updater_download_threading_import.py✏️
tests/test_updater_install_runtime_architecture.py🆕
tests/test_updater_pipeline_runtime.py✏️
tests/test_updater_settings_worker_architecture.py🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 Убрать блокировки интерфейса из DPI runtime
👤 Автор: loop-uh
🔗 SHA:
📊 Статистика: 46 files changed, 623 insertions(+), 888 deletions(-)
📁 Изменённые файлы:
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
🆕
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 Убрать блокировки интерфейса из DPI runtime
👤 Автор: loop-uh
🔗 SHA:
11afa05📊 Статистика: 46 files changed, 623 insertions(+), 888 deletions(-)
📁 Изменённые файлы:
✏️
src/app/feature_facades/runtime.py✏️
src/app/feature_facades/runtime_parts.py✏️
src/main/application_lifecycle.py✏️
src/main/application_post_startup.py✏️
src/main/post_startup.py✏️
src/main/post_startup_profile_warmup.py✏️
src/main/post_startup_user_presets_warmup.py✏️
src/main/startup_coordinator.py✏️
src/main/window_startup.py✏️
src/orchestra/page_runtime.py✏️
src/settings/dpi/page.py✏️
src/settings/dpi/workers.py✏️
src/telegram_proxy/ui/page_runtime.py✏️
src/ui/page_deps/system.py✏️
src/winws_runtime/monitoring/process_monitor_manager.py✏️
src/winws_runtime/public.py✏️
src/winws_runtime/runners/zapret1_runner.py✏️
src/winws_runtime/runners/zapret2_runner.py✏️
src/winws_runtime/runtime/autostart.py✏️
src/winws_runtime/runtime/commands.py✏️
src/winws_runtime/runtime/control_workers.py✏️
src/winws_runtime/runtime/discord_restart_flow.py✏️
src/winws_runtime/runtime/launch_runtime.py✏️
src/winws_runtime/runtime/lifecycle_feedback.py✏️
src/winws_runtime/runtime/method_switch_flow.py✏️
src/winws_runtime/runtime/preset_launch_service.py✏️
src/winws_runtime/runtime/restart_flow.py✏️
src/winws_runtime/runtime/start_flow.py✏️
src/winws_runtime/runtime/start_workers.py✏️
src/winws_runtime/runtime/startup.py✏️
src/winws_runtime/runtime/status_feedback.py✏️
src/winws_runtime/runtime/status_flow.py✏️
src/winws_runtime/runtime/stop_flow.py✏️
src/winws_runtime/runtime/sync_shutdown.py✏️
src/winws_runtime/state/launch_runtime_service.py✏️
tests/test_exit_watch_autorestart.py✏️
tests/test_main_startup_contract.py✏️
tests/test_orchestra_worker_architecture.py✏️
tests/test_preset_status_bar.py✏️
tests/test_runtime_process_pid.py✏️
tests/test_startup_autostart.py✏️
tests/test_startup_autostart_order.py✏️
tests/test_startup_bootstrap_metrics.py✏️
tests/test_startup_post_init_autostart.py✏️
tests/test_telegram_proxy_worker_architecture.py🆕
tests/test_winws_runtime_ui_thread_contract.py🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 Довести полный набор тестов до зелёного состояния
👤 Автор: loop-uh
🔗 SHA:
📊 Статистика: 11 files changed, 79 insertions(+), 53 deletions(-)
📁 Изменённые файлы:
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
✏️
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 Довести полный набор тестов до зелёного состояния
👤 Автор: loop-uh
🔗 SHA:
03afe9a📊 Статистика: 11 files changed, 79 insertions(+), 53 deletions(-)
📁 Изменённые файлы:
✏️
src/profile/identity.py✏️
src/profile/profile_setup_loader.py✏️
src/profile/ui/simple_icons_bundle.py✏️
src/updater/update_page_runtime.py✏️
src/winws_log_analyzer/ui/build.py✏️
src/winws_log_analyzer/ui/page.py✏️
tests/test_build_resource_layout.py✏️
tests/test_builtin_profile_catalog.py✏️
tests/test_profile_setup_accessibility.py✏️
tests/test_pyinstaller_archive_import_lock.py✏️
tests/test_ui_performance_metrics.py🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord
🔔 Новый коммит в youtubediscord/zapret
📝 Защитить кодировку описания выпуска
👤 Автор: loop-uh
🔗 SHA:
📊 Статистика: 1 file changed, 45 insertions(+)
📁 Изменённые файлы:
✏️
🔗 Открыть на GitHub
🔔 Новый коммит в youtubediscord/zapret
📝 Защитить кодировку описания выпуска
👤 Автор: loop-uh
🔗 SHA:
4c591dc📊 Статистика: 1 file changed, 45 insertions(+)
📁 Изменённые файлы:
✏️
tests/test_build_resource_layout.py🔗 Открыть на GitHub