Professional IPTV player platform with license management, admin panel and customer portal.
| Service | URL |
|---|---|
| π Home | https://x87player.xyz |
| π§ Admin | https://admin.x87player.xyz |
| π€ Portal | https://portal.x87player.xyz |
X87/
βββ server/ # Server-side code (Admin, Portal, Home page)
βββ clients/
β βββ windows/ # Windows desktop app (Python + PyQt6)
β βββ mobile/ # Mobile app - Android & iOS (Flutter)
βββ releases/ # Built binaries (.exe, .apk, .ipa)
βββ docs/ # Additional docs (may be incomplete vs this README)
- CentOS/RHEL (or compatible Linux)
- Python 3.9+
- Nginx
- systemd
Clone/check out the repo to:
/opt/iptv-panel
Example:
cd /opt
git clone https://github.com/Electro26/X87.git iptv-panel
cd /opt/iptv-panelThree Flask services run on the server:
| Service | File | Port | Public URL |
|---|---|---|---|
| Admin Panel | server/admin/admin_main.py |
5000 | https://admin.x87player.xyz |
| Customer Portal | server/portal/portal_main.py |
5001 | https://portal.x87player.xyz |
| Home Page | server/home/main.py |
5002 | https://x87player.xyz |
Expected service names:
x87-adminx87-portalx87-home
Common commands:
systemctl status x87-admin x87-portal x87-home
systemctl start x87-admin x87-portal x87-home
systemctl restart x87-admin x87-portal x87-homeIf nginx shows 502 Bad Gateway, check service status:
systemctl status x87-admin x87-portal x87-homeIf you see status=200/CHDIR, it means systemd cannot chdir into the WorkingDirectory (or the path in ExecStart is wrong).
Check your unit files:
/etc/systemd/system/x87-admin.service/etc/systemd/system/x87-portal.service/etc/systemd/system/x87-home.service
Paths must reference the repo layout under /opt/iptv-panel/server/..., e.g.:
/opt/iptv-panel/server/admin/admin_main.py/opt/iptv-panel/server/portal/portal_main.py/opt/iptv-panel/server/home/main.py
After fixing:
systemctl daemon-reload
systemctl restart x87-admin x87-portal x87-homeNginx proxies requests to the above ports.
Because nginx layouts differ by distro, check configs in one of:
/etc/nginx/nginx.conf/etc/nginx/conf.d/*.conf/etc/nginx/sites-available/*+/etc/nginx/sites-enabled/*
Test + reload:
nginx -t
systemctl reload nginxSometimes .pyc compiled Python files or cache files change locally and will block git pull.
Safe workflow:
cd /opt/iptv-panel
git status
# discard local changes (commonly .pyc / cache)
git checkout -- .
# pull latest
git pull
# restart services
systemctl restart x87-admin x87-portal x87-homeThe Windows app Settings dialog includes a π Deactivate License button intended for shared/public PCs.
When confirmed, it wipes ALL locally stored settings and saved credentials using Qt QSettings, then closes the app.
Namespaces cleared:
QSettings('IPTVPlayer', 'License')β activation/license infoQSettings('IPTVPlayer', 'LoginSettings')β saved IPTV profiles, usernames, passwords, server URLsQSettings('IPTVPlayer', 'Settings')β app settingsQSettings('IPTVPlayer', 'VLCSettings')β buffer/VLC settings
On Windows, QSettings typically maps to Registry under:
HKEY_CURRENT_USER\Software\IPTVPlayer\...
After deactivation, the device is left in a "fresh install" state:
- no saved IPTV usernames/passwords
- no saved profiles
- no app settings
- user must re-enter activation code on next launch
This root README is the source of truth. The docs below may have more detail but could be out of date.