From 3508a7c5ddfed984aa5903779476e38bbc4fdd24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80?= <6terio9@vk.com> Date: Fri, 20 Mar 2026 10:57:17 +1000 Subject: [PATCH] Initial commit: Kadr v2.0.0 --- .gitattributes | 2 + .gitignore | 58 +++ LICENSE | 21 + README.md | 127 +++++ data/Kadr.png | Bin 0 -> 1086877 bytes .../128x128/apps/io.github.cheviiot.kadr.png | Bin 0 -> 25249 bytes .../16x16/apps/io.github.cheviiot.kadr.png | Bin 0 -> 886 bytes .../24x24/apps/io.github.cheviiot.kadr.png | Bin 0 -> 1676 bytes .../256x256/apps/io.github.cheviiot.kadr.png | Bin 0 -> 80518 bytes .../32x32/apps/io.github.cheviiot.kadr.png | Bin 0 -> 2694 bytes .../48x48/apps/io.github.cheviiot.kadr.png | Bin 0 -> 5085 bytes .../512x512/apps/io.github.cheviiot.kadr.png | Bin 0 -> 282466 bytes .../64x64/apps/io.github.cheviiot.kadr.png | Bin 0 -> 8220 bytes .../scalable/apps/io.github.cheviiot.kadr.png | Bin 0 -> 907193 bytes data/io.github.cheviiot.kadr.desktop | 11 + kadr | 14 + pyproject.toml | 37 ++ src/kadr/__init__.py | 23 + src/kadr/__main__.py | 54 ++ src/kadr/application.py | 91 ++++ src/kadr/data/style.css | 90 ++++ src/kadr/services/__init__.py | 0 src/kadr/services/downloads.py | 125 +++++ src/kadr/services/jackett.py | 121 +++++ src/kadr/services/settings.py | 38 ++ src/kadr/services/tmdb.py | 110 +++++ src/kadr/utils.py | 121 +++++ src/kadr/views/__init__.py | 0 src/kadr/views/detail.py | 268 ++++++++++ src/kadr/views/home.py | 466 ++++++++++++++++++ src/kadr/views/settings_dialog.py | 218 ++++++++ src/kadr/widgets/__init__.py | 0 src/kadr/widgets/media_card.py | 110 +++++ src/kadr/widgets/torrent_row.py | 72 +++ src/kadr/window.py | 49 ++ 35 files changed, 2226 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 data/Kadr.png create mode 100644 data/icons/hicolor/128x128/apps/io.github.cheviiot.kadr.png create mode 100644 data/icons/hicolor/16x16/apps/io.github.cheviiot.kadr.png create mode 100644 data/icons/hicolor/24x24/apps/io.github.cheviiot.kadr.png create mode 100644 data/icons/hicolor/256x256/apps/io.github.cheviiot.kadr.png create mode 100644 data/icons/hicolor/32x32/apps/io.github.cheviiot.kadr.png create mode 100644 data/icons/hicolor/48x48/apps/io.github.cheviiot.kadr.png create mode 100644 data/icons/hicolor/512x512/apps/io.github.cheviiot.kadr.png create mode 100644 data/icons/hicolor/64x64/apps/io.github.cheviiot.kadr.png create mode 100644 data/icons/hicolor/scalable/apps/io.github.cheviiot.kadr.png create mode 100644 data/io.github.cheviiot.kadr.desktop create mode 100755 kadr create mode 100644 pyproject.toml create mode 100644 src/kadr/__init__.py create mode 100644 src/kadr/__main__.py create mode 100644 src/kadr/application.py create mode 100644 src/kadr/data/style.css create mode 100644 src/kadr/services/__init__.py create mode 100644 src/kadr/services/downloads.py create mode 100644 src/kadr/services/jackett.py create mode 100644 src/kadr/services/settings.py create mode 100644 src/kadr/services/tmdb.py create mode 100644 src/kadr/utils.py create mode 100644 src/kadr/views/__init__.py create mode 100644 src/kadr/views/detail.py create mode 100644 src/kadr/views/home.py create mode 100644 src/kadr/views/settings_dialog.py create mode 100644 src/kadr/widgets/__init__.py create mode 100644 src/kadr/widgets/media_card.py create mode 100644 src/kadr/widgets/torrent_row.py create mode 100644 src/kadr/window.py diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7737bc7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,58 @@ +# Python +__pycache__/ +.pycache/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# Virtual environments +.venv/ +venv/ +ENV/ + +# IDE +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db +.directory + +# Project +*.log +.cache/ + +# Logs +*.log +npm-debug.log* + +# Temp +*.tmp +*.temp +.cache/ + +# Package artifacts +*.AppImage +*.deb +*.rpm +*.pkg.tar.zst diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2af49b7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Cheviiot (https://github.com/Cheviiot) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..b62fd76 --- /dev/null +++ b/README.md @@ -0,0 +1,127 @@ +
+ 🎬 Элегантное приложение для поиска торрентов фильмов и сериалов +
+ + + ++ Установка • + Особенности • + Запуск • + Лицензия +
+ +--- + +## ✨ Особенности + +- 🔍 **Поиск фильмов и сериалов** — интеграция с TMDB +- 🧲 **Поиск торрентов** — через публичные Jackett серверы (без настройки!) +- ⬇️ **Загрузка в один клик** — отправка в FDM, qBittorrent, Transmission, Deluge, KTorrent +- 🎨 **Нативный интерфейс** — GTK4 + libadwaita +- 🚀 **Быстрая работа** — Python, асинхронная загрузка изображений + +--- + +## 🛠️ Технологии + +| Компонент | Стек | +|-----------|------| +| UI | GTK4 + libadwaita | +| Язык | Python 3.10+ | +| HTTP | requests | +| API | TMDB, Jackett | + +--- + +## 📦 Установка зависимостей + +### Fedora + +```bash +sudo dnf install gtk4-devel libadwaita-devel python3-gobject python3-requests +``` + +### Ubuntu / Debian + +```bash +sudo apt install libgtk-4-dev libadwaita-1-dev gir1.2-adw-1 python3-gi python3-requests +``` + +### Arch Linux + +```bash +sudo pacman -S gtk4 libadwaita python-gobject python-requests +``` + +Или через pip (PyGObject требует системных библиотек GTK): + +```bash +pip install requests PyGObject +``` + +--- + +## 🚀 Запуск + +### Из исходников + +```bash +git clone https://github.com/Cheviiot/Kadr.git +cd Kadr +./kadr +``` + +**Горячие клавиши:** +- `Ctrl+F` — Поиск +- `Ctrl+Q` — Выход + +--- + +## 📁 Структура проекта + +``` +kadr # Исполняемый лаунчер +pyproject.toml # Сборка (hatchling) +data/ + Kadr.png # Иконка приложения + io.github.cheviiot.kadr.desktop +src/kadr/ + __init__.py # Версия, пути, константы + __main__.py # Entry point, проверка gi + application.py # Adw.Application + window.py # Главное окно + utils.py # Утилиты (async, кеш изображений) + data/ + style.css # Кастомные стили + services/ + settings.py # Настройки (~/.config/Kadr/) + tmdb.py # TMDB API + jackett.py # Jackett торрент-поиск + downloads.py # Менеджер загрузок + views/ + home.py # Главный вид (сетка, поиск, табы) + detail.py # Детали фильма/сериала + торренты + settings_dialog.py # Диалог настроек + widgets/ + media_card.py # Карточка фильма/сериала + torrent_row.py # Строка торрента +archive/ # Предыдущая версия (Go + Wails v3) +``` + +--- + +## 📄 Лицензия + +[MIT](LICENSE) + +--- + ++ Made with ❤️ by Cheviiot +
diff --git a/data/Kadr.png b/data/Kadr.png new file mode 100644 index 0000000000000000000000000000000000000000..86eee801292fcb2a151668a5dfee6cba81552fd4 GIT binary patch literal 1086877 zcmeFYRa=`~v^5+Yij@LIgM}i+-Q9`>Ymq{c;_mLyV#VEqyF+m;6nA%r;2PZC?#K4` z6TX9ekZa|-Pm;CfJ;xk#jJZOU!7`Yyh+hE!08H5rlBxgz;-9aG0952Zi!YEN@Xvx~ z_d&}M06>59KOeZs6`w}{fC3;ZDfZC~?x@YPjCR3g?Gw}+eB*xO>0wgg{p42~tx4$+ zjloQ{y# F-AZ8>j|pKp|2AJ`1wyxgti(P9bY;@Y6XZ=ra7wVJ8iC
z-o#h%%@Z%lc4_OVC32br=)Iq)xR;M1Ff*U;2TJj8?W~-E^Q>0$XK)_?FFQ$j>8+dh
zw5B$lr)cndxZ@Pn?yE05^!T +~39-gXr;f*wa51c42qj{HsOF
z^Rgm^aS;6r4b3|To{wTE$+El0eevg#|D8n)n5Faw)t~aI%Ku 0Ddrja7e
zz5+2C1a~ pC;Bq7GLQy`cZcF_p>K8EN>tLyPp9
zU_p=k>_AuB_C)-~FiXL2st+X5);41_&TxeC$?2Q*Kv#BY{YibeB=9||FUbtA )9$kpR1%cAuytN%4mcmrlPboXF*yM5(UUIgNF=~NJsp2_9gR`=|YvfT?~1t6
zZFg+)d_HYxwtL&cxy9?S(gTO~3>GmUTjZH>G)EBgLf7AB?o(+^KRzgPzdl=PusO=I
zMOr+18_kfZev2n-Ug6z`&F45u7!0C=MJLh9=}MKioELqxP57(DL=P#fMoLgNH#>#L
z)${N>gcKit!dQEjN4U>W`Z&61dZH@UcL
zPi%ym`UEjF)x9MNkfaPu3|Pd~UQLa6n1R!p47l^N
zZ~4P&HUW!C1*eZ9~ckkR)0D|=8rjA5s@QN#)XvQ2*#Md=H0
z8UNL>!@6L1-|@--AX?ftZ02i&ogX0I3<^%Y6>fJX&|5J}43b&57Pz?J_d5RBoU!hE
zu=hogdOEpuB6iC8W%$bZa8JBv+L0~`{QMQoPOm0NnF2~d^Nx$^+%2$rSW2daTT?ai
z5MaE0r<_S~hN