@officebeats/matrix-iptv-cli 3.3.0 → 3.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGES.md +29 -0
- package/README.md +25 -20
- package/debug_dns.py +11 -0
- package/debug_redirect.py +22 -0
- package/debug_stream.py +28 -0
- package/image/README/1768788798110.png +0 -0
- package/package.json +1 -1
- package/response.html +20 -0
- package/scripts/benchmark_playlists.py +50 -0
- package/test_config.json +3 -3
package/CHANGES.md
CHANGED
|
@@ -1,5 +1,34 @@
|
|
|
1
1
|
# IPTV App Changes Summary
|
|
2
2
|
|
|
3
|
+
## Date: 2026-01-18 (v3.3.1)
|
|
4
|
+
|
|
5
|
+
### Changes Implemented
|
|
6
|
+
|
|
7
|
+
#### ✅ 1. Restored Detailed Help Guides
|
|
8
|
+
|
|
9
|
+
- Re-implemented the technical and instructional depth for "The TUI Edge", "Playlist Acquisition", and "IPTV Protocol".
|
|
10
|
+
- Guides now feature rich formatting and specific advice (Marketplaces, Providers, Technical Specs).
|
|
11
|
+
|
|
12
|
+
#### ✅ 2. UI/UX Refinement
|
|
13
|
+
|
|
14
|
+
- Moved version identifier to the bottom-left of the footer for better visibility during testing.
|
|
15
|
+
- Updated Home Screen labels to be more descriptive ("The TUI Edge", "Understanding the Protocol").
|
|
16
|
+
- Fixed the "Gray Icon" issue caused by leftover sports league fallbacks.
|
|
17
|
+
- Simplified Category view to use a clean folder icon system.
|
|
18
|
+
|
|
19
|
+
#### ✅ 3. Improved MPV Isolation
|
|
20
|
+
|
|
21
|
+
- Detached MPV from terminal input/output to prevent keyboard shortcut conflicts.
|
|
22
|
+
- On Windows, MPV now runs in a detached process to ensure CLI focus remains on the app.
|
|
23
|
+
|
|
24
|
+
#### ✅ 4. Infrastructure & Test Sync
|
|
25
|
+
|
|
26
|
+
- Updated global `test-matrix-iptv` command and PowerShell profile to point to the current (OneDrive) workspace.
|
|
27
|
+
- Fixed a version mismatch where tests were running older cached binaries.
|
|
28
|
+
- Established a new `update_and_test` workflow to ensure builds are synced to the Node wrapper's `bin/` directory.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
3
32
|
## Date: 2025-12-27 (v3.0.8)
|
|
4
33
|
|
|
5
34
|
### Changes Implemented
|
package/README.md
CHANGED
|
@@ -80,8 +80,8 @@ matrix-iptv
|
|
|
80
80
|
- **🛡️ Multi-Select Playlist Modes**: Combine optimizations like **'Merica**, **Sports**, and **All-English** in real-time.
|
|
81
81
|
- **⚡ Instant Response**: Built in Rust for maximum performance. Navigate tens of thousands of channels with zero lag.
|
|
82
82
|
- **📡 Xtream API Native**: Strictly optimized for **Xtream API** providers (support for M3U is not planned at this time).
|
|
83
|
-
- **🔎 Global Search**: Press **`Ctrl`+`Space`** (displayed as `🔎🌐 Ctrl+Space`) to search across Live TV, Movies, and Series content instantly.
|
|
84
|
-
- **📁 Unified Navigation**: "All" views for Channels, Movies, and Series allow for rapid browsing without digging into categories.
|
|
83
|
+
- **🔎 Global Search**: Press **`Ctrl`+`Space`** (displayed as `🔎🌐 Ctrl+Space`) to search across Live TV, Movies, and Series content instantly. Results are limited to 100 items total (channels, movies, and series combined).
|
|
84
|
+
- **📁 Unified Navigation**: "All" views for Channels, Movies, and Series allow for rapid browsing without digging into categories. Use **Tab** to switch between categories and streams, **Left/Right** arrows to navigate panes. Use **Tab** to switch between categories and streams, **Left/Right** arrows to navigate panes.
|
|
85
85
|
- **🎨 Color-Coded UX**: Rebuilt footer with screen-aware hints and color coding.
|
|
86
86
|
- **🚥 Mode Indicators**: Colorful header indicators (Red/White/Blue for 'Merica, Yellow for Sports, Blue for All-English).
|
|
87
87
|
- **📋 Paste Support**: Support for `Ctrl+V` in login fields for quick credentials setup.
|
|
@@ -89,7 +89,8 @@ matrix-iptv
|
|
|
89
89
|
- **🎞️ VOD Experience**: Browse movies with rich metadata and instant playback.
|
|
90
90
|
- **📟 Matrix Rain Screensaver**: A high-performance, authentic digital rain screensaver that activates when idle.
|
|
91
91
|
- **🔒 Secure**: Uses Private DNS-over-HTTPS (DoH) for secure provider connection.
|
|
92
|
-
-
|
|
92
|
+
- **⚡ Jump Navigation**: Press **`g`** to jump to bottom, **`G`** to jump to top, or **`0`-`9`** to jump directly to items 0-9 in any list.
|
|
93
|
+
- **⚡ Jump Navigation**: Press **`g`** to jump to bottom, **`G`** to jump to top, or **`0`-`9`** to jump directly to items 0-9 in any list.
|
|
93
94
|
|
|
94
95
|
## 🛡️ Playlist Modes
|
|
95
96
|
|
|
@@ -115,7 +116,8 @@ To change modes:
|
|
|
115
116
|
|
|
116
117
|
We leverage advanced **MPV** flags to ensure professional-level video quality even on lower-end hardware:
|
|
117
118
|
|
|
118
|
-
- **
|
|
119
|
+
- **Fullscreen Mode**: Launches directly into fullscreen (`--fs`) for a professional, TV-like experience.
|
|
120
|
+
- **On Screen Controller**: Enables `--osc=yes` for usability and control.
|
|
119
121
|
- **Advanced Anti-Aliasing**: Uses `spline36` scaling, providing superior edge smoothing.
|
|
120
122
|
- **Oversample Upscaling**: High-quality temporal upscaling that sharpens images.
|
|
121
123
|
- **Motion Smoothing**: High-performance `display-resample` interpolation for fluid sports playback.
|
|
@@ -125,22 +127,25 @@ We leverage advanced **MPV** flags to ensure professional-level video quality ev
|
|
|
125
127
|
|
|
126
128
|
## ⌨️ Common Controls
|
|
127
129
|
|
|
128
|
-
| Key | Action
|
|
129
|
-
| :---------------------- |
|
|
130
|
-
| **`Enter`** | **Play Channel / Select / Confirm**
|
|
131
|
-
| **`Esc` / `Backspace`** | **Go Back / Cancel**
|
|
132
|
-
| **`Ctrl` + `Space`** | **Global Search** (Search everything)
|
|
133
|
-
| **`f`** or **`/`** | **Local Search** (Filter current view)
|
|
134
|
-
| **`v`** | **Toggle Favorite**
|
|
135
|
-
| **`j` / `↓`** | Move Down
|
|
136
|
-
| **`k` / `↑`** | Move Up
|
|
137
|
-
| **`
|
|
138
|
-
| **`
|
|
139
|
-
| **`
|
|
140
|
-
| **`
|
|
141
|
-
| **`
|
|
142
|
-
| **`
|
|
143
|
-
| **`
|
|
130
|
+
| Key | Action |
|
|
131
|
+
| :---------------------- | :-------------------------------------------- |
|
|
132
|
+
| **`Enter`** | **Play Channel / Select / Confirm** |
|
|
133
|
+
| **`Esc` / `Backspace`** | **Go Back / Cancel** |
|
|
134
|
+
| **`Ctrl` + `Space`** | **Global Search** (Search everything) |
|
|
135
|
+
| **`f`** or **`/`** | **Local Search** (Filter current view) |
|
|
136
|
+
| **`v`** | **Toggle Favorite** |
|
|
137
|
+
| **`j` / `↓`** | Move Down |
|
|
138
|
+
| **`k` / `↑`** | Move Up |
|
|
139
|
+
| **`g`** | **Jump to Bottom** (Go to last item) |
|
|
140
|
+
| **`G`** | **Jump to Top** (Go to first item) |
|
|
141
|
+
| **`0`-`9`** | **Jump to Item** (Direct access to items 0-9) |
|
|
142
|
+
| **`m`** | **Playlist Mode** (Quick Toggle/Switch) |
|
|
143
|
+
| **`x`** | **Settings** |
|
|
144
|
+
| **`n`** | **New Playlist** (Home Screen) |
|
|
145
|
+
| **`e`** | **Edit Playlist** (Home Screen) |
|
|
146
|
+
| **`d`** | **Delete Playlist** (Home Screen) |
|
|
147
|
+
| **`r`** | **Refresh Playlist** (Global) |
|
|
148
|
+
| **`q`** | **Quit** |
|
|
144
149
|
|
|
145
150
|
---
|
|
146
151
|
|
package/debug_dns.py
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import requests
|
|
2
|
+
|
|
3
|
+
url_ts = "http://zfruvync.duperab.xyz/live/PE1S9S8U/11EZZUMW/53504.ts"
|
|
4
|
+
url_m3u8 = "http://zfruvync.duperab.xyz/live/PE1S9S8U/11EZZUMW/53504.m3u8"
|
|
5
|
+
headers = {
|
|
6
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
def check(name, u):
|
|
10
|
+
print(f"Checking {name}...")
|
|
11
|
+
try:
|
|
12
|
+
r = requests.head(u, headers=headers, allow_redirects=False, timeout=5)
|
|
13
|
+
print(f"Status: {r.status_code}")
|
|
14
|
+
if 'Location' in r.headers:
|
|
15
|
+
print(f"Location: {r.headers['Location']}")
|
|
16
|
+
else:
|
|
17
|
+
print("No Location header")
|
|
18
|
+
except Exception as e:
|
|
19
|
+
print(f"Error: {e}")
|
|
20
|
+
|
|
21
|
+
check("TS", url_ts)
|
|
22
|
+
check("M3U8", url_m3u8)
|
package/debug_stream.py
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import requests
|
|
2
|
+
import sys
|
|
3
|
+
|
|
4
|
+
url = "http://zfruvync.duperab.xyz/live/PE1S9S8U/11EZZUMW/53504.ts"
|
|
5
|
+
headers = {
|
|
6
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
|
|
7
|
+
"Referer": "http://zfruvync.duperab.xyz/"
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
print(f"Testing URL: {url}")
|
|
11
|
+
try:
|
|
12
|
+
with requests.get(url, headers=headers, stream=True, timeout=10) as r:
|
|
13
|
+
print(f"Status Code: {r.status_code}")
|
|
14
|
+
print("Headers:")
|
|
15
|
+
for k, v in r.headers.items():
|
|
16
|
+
print(f" {k}: {v}")
|
|
17
|
+
|
|
18
|
+
if r.status_code == 200:
|
|
19
|
+
print("\nReading first 64 bytes...")
|
|
20
|
+
chunk = next(r.iter_content(chunk_size=64))
|
|
21
|
+
print(f"Bytes len: {len(chunk)}")
|
|
22
|
+
if len(chunk) > 0:
|
|
23
|
+
print("SUCCESS: Stream is alive!")
|
|
24
|
+
else:
|
|
25
|
+
print(f"\nFAILURE: Server returned {r.status_code}")
|
|
26
|
+
|
|
27
|
+
except Exception as e:
|
|
28
|
+
print(f"\nEXCEPTION: {e}")
|
|
Binary file
|
package/package.json
CHANGED
package/response.html
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html style="height:100%">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title></title>
|
|
7
|
+
<script type="text/javascript">
|
|
8
|
+
var url="https://myhomenetwork.att.com";
|
|
9
|
+
var reason=["phishing"];
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
</head>
|
|
13
|
+
<body style="margin: 0 auto; padding: 0 auto; width:100%; height: 100%; overflow : hidden;">
|
|
14
|
+
<iframe src="" id="frame" seamless="seamless" style="margin: 0 auto; padding: 0 auto; border: 0; width:100%; height: 100%" > </iframe>
|
|
15
|
+
|
|
16
|
+
<script type="text/javascript">
|
|
17
|
+
document.getElementById('frame').src = url+"/networkprotected/index.html?reason="+reason[0]+"&source="+encodeURIComponent(window.location.href);
|
|
18
|
+
</script>
|
|
19
|
+
</body>
|
|
20
|
+
</html>
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import urllib.request
|
|
2
|
+
import json
|
|
3
|
+
import time
|
|
4
|
+
|
|
5
|
+
accounts = [
|
|
6
|
+
{"name": "Strong 8K", "url": "http://pledge78502.cdn-akm.me:80", "user": "7c34d33c9e21", "pass": "037dacb169"},
|
|
7
|
+
{"name": "Trex", "url": "http://line.offcial-trex.pro", "user": "3a6aae52fb", "pass": "39c165888139"},
|
|
8
|
+
{"name": "Strong8k2-PC", "url": "http://zfruvync.duperab.xyz", "user": "PE1S9S8U", "pass": "11EZZUMW"},
|
|
9
|
+
{"name": "Mega OTT 1", "url": "http://line.4smart.in", "user": "45Z88W6", "pass": "Z7PHTX3"}
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
print("=== Matrix IPTV Performance Benchmark (Python) ===")
|
|
13
|
+
|
|
14
|
+
for acc in accounts:
|
|
15
|
+
print(f"\nProcessing: {acc['name']}")
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
# 1. Categories
|
|
19
|
+
start = time.time()
|
|
20
|
+
cat_url = f"{acc['url']}/player_api.php?username={acc['user']}&password={acc['pass']}&action=get_live_categories"
|
|
21
|
+
with urllib.request.urlopen(cat_url, timeout=30) as resp:
|
|
22
|
+
cats = json.loads(resp.read().decode())
|
|
23
|
+
duration = time.time() - start
|
|
24
|
+
print(f" ✅ Categories: {len(cats)} items in {duration:.2f}s")
|
|
25
|
+
|
|
26
|
+
# 2. Streams & MSNBC
|
|
27
|
+
print(" 🔍 Searching for MSNBC...")
|
|
28
|
+
start = time.time()
|
|
29
|
+
streams_url = f"{acc['url']}/player_api.php?username={acc['user']}&password={acc['pass']}&action=get_live_streams"
|
|
30
|
+
with urllib.request.urlopen(streams_url, timeout=120) as resp:
|
|
31
|
+
streams = json.loads(resp.read().decode())
|
|
32
|
+
duration = time.time() - start
|
|
33
|
+
print(f" ✅ Streams: {len(streams)} items in {duration:.2f}s")
|
|
34
|
+
|
|
35
|
+
msnbc = [s for s in streams if "MSNBC" in s.get("name", "")]
|
|
36
|
+
if msnbc:
|
|
37
|
+
print(f" 📍 Found {len(msnbc)} MSNBC streams:")
|
|
38
|
+
for s in msnbc[:3]:
|
|
39
|
+
stream_id = s.get("stream_id")
|
|
40
|
+
name = s.get("name")
|
|
41
|
+
play_url = f"{acc['url']}/live/{acc['user']}/{acc['pass']}/{stream_id}.ts"
|
|
42
|
+
print(f" - [{stream_id}] {name}")
|
|
43
|
+
print(f" Link: {play_url}")
|
|
44
|
+
else:
|
|
45
|
+
print(" ❌ MSNBC NOT FOUND.")
|
|
46
|
+
|
|
47
|
+
except Exception as e:
|
|
48
|
+
print(f" ❌ Error: {e}")
|
|
49
|
+
|
|
50
|
+
print("\n=== Benchmark Complete ===")
|
package/test_config.json
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"accounts": [
|
|
3
3
|
{
|
|
4
4
|
"name": "Strong 8K",
|
|
5
|
-
"base_url": "http://
|
|
6
|
-
"username": "
|
|
7
|
-
"password": "
|
|
5
|
+
"base_url": "http://zfruvync.duperab.xyz",
|
|
6
|
+
"username": "PE1S9S8U",
|
|
7
|
+
"password": "11EZZUMW",
|
|
8
8
|
"epg_url": null,
|
|
9
9
|
"last_refreshed": null,
|
|
10
10
|
"total_channels": null,
|