released v1.3.5

This commit is contained in:
Pari Malam
2026-06-27 10:13:14 +08:00
parent 3cc4496aa2
commit 5a859323a5
3 changed files with 171 additions and 30 deletions
+14 -8
View File
@@ -57,8 +57,8 @@ GOMEMLIMIT="${GOMEMLIMIT:-2GiB}"
KEEP_FALSE=true
MAX_STREAMS="${MAX_STREAMS:-0}"
HTTPS="${HTTPS:-false}"
ADMIN_USER="${ADMIN_USER:-}"
ADMIN_PASS="${ADMIN_PASS:-}"
ADMIN_USER="${ADMIN_USER:-admin}"
ADMIN_PASS="${ADMIN_PASS:-admin1337}"
# Working directory (where binary and configs live)
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
@@ -213,9 +213,7 @@ if [ "$MONITOR" = "true" ]; then
echo " Audit log: logs/audit.log"
echo " Alert log: logs/audit_alerts.log"
fi
echo " (use 127.0.0.1 instead of 127.0.0.1 in your browser)"
echo ""
echo "Login: admin / <see temp password in log below>"
echo ".++===========================================================================================++."
echo ""
# FIX: Unified background PID tracking + cleanup (replaces separate handlers)
@@ -250,7 +248,7 @@ if [ "$MONITOR" = "true" ] || [ "$HLS_PROXY" = "true" ]; then
while [ $_O11_TRIES -lt 30 ]; do
_O11_TRIES=$((_O11_TRIES + 1))
if python3 -c "import socket; s=socket.socket(); s.settimeout(1); s.connect(('127.0.0.1',$PORT)); s.close()" 2>/dev/null; then
echo "o11pro is ready"
echo ".++===========================================================================================++."
break
fi
if [ $_O11_TRIES -eq 30 ]; then
@@ -265,9 +263,16 @@ if [ "$MONITOR" = "true" ] || [ "$HLS_PROXY" = "true" ]; then
if [ "$HLS_PROXY" = "true" ]; then
if [ ! -f "modules/hls_proxy.py" ]; then
echo "WARNING: modules/hls_proxy.py not found skipping HLS proxy"
elif [ ! -f "$HLS_PROXY_CONFIG" ]; then
else
# Auto-generate orig_urls.json from provider .cfg files
if [ -f "modules/generate_orig_urls.py" ]; then
echo "Generating HLS proxy config from providers..."
python3 modules/generate_orig_urls.py \
--dir "$PROJECT_ROOT/providers" \
--output "$HLS_PROXY_CONFIG" || true
fi
if [ ! -f "$HLS_PROXY_CONFIG" ]; then
echo "WARNING: HLS proxy config not found at $HLS_PROXY_CONFIG skipping HLS proxy"
echo " Run setup.sh to auto-generate it from provider config"
else
echo "Starting HLS Proxy on port $HLS_PROXY_PORT..."
python3 modules/hls_proxy.py \
@@ -279,6 +284,7 @@ if [ "$MONITOR" = "true" ] || [ "$HLS_PROXY" = "true" ]; then
echo "HLS Proxy started (PID $HLS_PID)"
fi
fi
fi
# Start security monitor if enabled
if [ "$MONITOR" = "true" ]; then
+135
View File
@@ -0,0 +1,135 @@
#!/usr/bin/env python3
"""Scan provider .cfg files and generate cache/orig_urls.json for HLS proxy.
Usage:
python3 generate_orig_urls.py
python3 generate_orig_urls.py --dir ../providers (custom provider dir)
python3 generate_orig_urls.py --output ../../cache/orig_urls.json
"""
import json
import os
import sys
import glob
import argparse
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
PROJECT_DIR = os.path.normpath(os.path.join(SCRIPT_DIR, '..', '..'))
DEFAULT_PROVIDERS_DIR = os.path.join(PROJECT_DIR, 'providers')
DEFAULT_OUTPUT = os.path.join(PROJECT_DIR, 'cache', 'orig_urls.json')
HLS_OUTPUT_MODES = {'directhls', 'hls', 'hlsts', 'hlsfmp4'}
HLS_RUNNING_MODES = {'internalremuxer', 'hls'}
def find_cfg_files(providers_dir):
if not os.path.isdir(providers_dir):
return []
return glob.glob(os.path.join(providers_dir, '*.cfg'))
def extract_hls_streams(cfg_path):
try:
with open(cfg_path) as f:
data = json.load(f)
except (json.JSONDecodeError, OSError) as e:
print(f' SKIP: {os.path.basename(cfg_path)} parse error: {e}', file=sys.stderr)
return []
streams = []
provider_name = data.get('Name', os.path.splitext(os.path.basename(cfg_path))[0])
# Check if this provider is HLS-capable
output_mode = data.get('OutputMode', '')
running_mode = data.get('RunningMode', '')
for s in data.get('Streams', []):
manifest = s.get('Manifest', '')
if not manifest:
continue
# Determine if stream is HLS — check OutputMode, RunningMode, or manifest URL
stream_output = s.get('OutputMode', output_mode)
stream_running = s.get('RunningMode', running_mode)
is_hls = (
stream_output.lower() in HLS_OUTPUT_MODES
or stream_running.lower() in HLS_RUNNING_MODES
or '.m3u8' in manifest.lower()
)
if not is_hls:
continue
name = s.get('Name', '').strip()
if not name:
continue
# Check for auth params
auth = None
script_user = s.get('ScriptAccountsUser', '')
script_params = s.get('ScriptParams', '')
if script_user and script_params and ':' in script_params:
parts = script_params.split()
for p in parts:
if ':' in p and not p.startswith('-'):
auth = p.split(':', 1)
break
streams.append({
'name': name,
'url': manifest,
'auth': auth,
'provider': provider_name,
})
return streams
def generate(providers_dir, output_path):
cfg_files = find_cfg_files(providers_dir)
if not cfg_files:
print(f'No .cfg files found in {providers_dir}')
print('Providers directory will be created at runtime by RunMe.sh')
return False
all_streams = []
for path in sorted(cfg_files):
streams = extract_hls_streams(path)
if streams:
all_streams.extend(streams)
print(f' {os.path.basename(path)}: {len(streams)} HLS streams')
if not all_streams:
print('No HLS streams found in any config files')
return False
# Build the output map
channel_map = {}
for s in all_streams:
if s['auth']:
channel_map[s['name']] = {
'url': s['url'],
'auth': s['auth']
}
else:
channel_map[s['name']] = s['url']
os.makedirs(os.path.dirname(output_path), exist_ok=True)
with open(output_path, 'w') as f:
json.dump(channel_map, f, indent=2, ensure_ascii=False)
print(f'\nGenerated {len(channel_map)} channels -> {output_path}')
return True
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Generate orig_urls.json for HLS proxy from provider .cfg files')
parser.add_argument('--dir', default=DEFAULT_PROVIDERS_DIR,
help=f'Provider configs directory (default: {DEFAULT_PROVIDERS_DIR})')
parser.add_argument('--output', default=DEFAULT_OUTPUT,
help=f'Output path (default: {DEFAULT_OUTPUT})')
args = parser.parse_args()
print(f'Providers dir: {args.dir}')
print(f'Output: {args.output}')
print()
success = generate(args.dir, args.output)
if not success:
print('\nTip: place .cfg provider files in the providers/ directory and re-run')
sys.exit(1)
+13 -13
View File
@@ -672,11 +672,11 @@
"Video": "",
"Audio": "",
"Subtitles": "",
"VideoList": null,
"AudioList": null,
"SubtitlesList": null,
"VideoList": [],
"AudioList": [],
"SubtitlesList": [],
"IgnoreKid": false,
"Keys": null,
"Keys": [],
"Drm": {
"Vendor": null
},
@@ -768,11 +768,11 @@
"Video": "",
"Audio": "",
"Subtitles": "",
"VideoList": null,
"AudioList": null,
"SubtitlesList": null,
"VideoList": [],
"AudioList": [],
"SubtitlesList": [],
"IgnoreKid": false,
"Keys": null,
"Keys": [],
"Drm": {
"Vendor": null
},
@@ -864,11 +864,11 @@
"Video": "",
"Audio": "",
"Subtitles": "",
"VideoList": null,
"AudioList": null,
"SubtitlesList": null,
"VideoList": [],
"AudioList": [],
"SubtitlesList": [],
"IgnoreKid": false,
"Keys": null,
"Keys": [],
"Drm": {
"Vendor": null
},
@@ -994,7 +994,7 @@
],
"SubtitlesList": [],
"IgnoreKid": false,
"Keys": null,
"Keys": [],
"Drm": {
"Vendor": null
},