AddedmodifyColumn support to the Database Migration feature (Migrate::modifyColumn, MigrationQueries::getModifiedFieldQueries) to rename table columns while preserving existing data during schema upgrades, and extracted the column builder into the MigrateColumnTypes trait.
Added a complete routing reference document (ROUTER.md) covering application routes and dispatch behavior.
Added root .htaccess rewrite rules that forward requests to the public/ directory for cPanel-style deployments.
Added Host Connectivity & Stability Telemetry system (includes/classes/Helper/StreamTelemetry.php) with RAM-to-DB periodic flushing (host_telemetry_{loadBalancerId}_{type}_{vHost}) for MySQL B-Tree index prefix range queries.
Added browser client-side telemetry JavaScript library (public/assets/js/telemetry-v1.0.0.js / .min.js) with automatic global media capturing (autoInit) for dynamic player engines (Plyr, JWPlayer, HLS.js, Shaka, Novage P2P).
Added horizontal Host Stability Rank ribbon bar with hover tooltips and host logos on the Video List page (includes/templates/backend/videos/list.twig).
AddedHostHealth service (includes/classes/Service/HostHealth.php) that tracks unreachable upstream identities (DNS/connection failures or repeatedly empty extraction) and short-circuits them to 404 for a TTL once a failure threshold is reached, wired into Core, SourceHelper, and poster.php.
Added automatic Nginx configuration generation (ServerConfigManager::ensure(), ensureNginxConfigFile()) that lazily writes resources/nginx/site.d/nginx.conf on the first request or during migration, using an InstanceCache staleness signature and file locking so the in-sync path performs no file I/O.
Added Cache Tag Versioning system (getTagVersion, invalidateTag, invalidateTags, createVersionedKey) to InstanceCache to eliminate Phpfastcache tag index bloat in Redis.
Added dynamic and configurable database cache timeouts (DB_CACHE_TIMEOUT_MIN, DB_CACHE_TIMEOUT_SETTINGS, DB_CACHE_TIMEOUT_VIDEOS) in config.php and ModelHelper::getCacheTimeout().
Added an HTTP-first extraction path to the Dood extractor (parseSourcesViaHttp()) so playback URLs are resolved without a headless browser, which is now used only as a fallback.
AddedVideoAlternative::insertMultiByVideoId() to centralize alternative-link insertion on the video add/edit pages.
Added PID-reuse protection to BackgroundTrait::isRunning() and stopPid() via an optional process image name, so a recycled PID is never treated as (or killed as) the target process.
Added 24-hour empty-source marking in XVFSParser so upstreams that returned no sources are not re-requested immediately, plus a permanent (24-hour) block for hosts whose extractor class is missing in Core.
Added slug-based and alternative hash-based direct streaming URL routing (direct/mp4/{slug}, direct/hls/{slug}, direct/mpd/{slug}) in includes/views/frontend/direct.php and includes/views/backend/videos/edit.php.
Added optional Redis instance injection support to CircuitBreaker static methods (isAvailable, recordFailure, recordSuccess) for compatibility with long-running application runtimes (Swoole, RoadRunner, background workers).
Added Circuit Breaker protection to Maxmind::getMaxmindIPInfo to prevent repeated lookups and fall back smoothly when IP info is missing or unavailable.
Added modular script-bundle widget templates default-frontend-scripts.twig and default-backend-scripts.twig (includes/templates/widget/) extracted from inline footer <script> lists, enabling per-theme overriding of frontend and backend script bundles.
Addeddefault-header-scripts.twig widget template (includes/templates/widget/) extracting inline header <script> bootstrap variables (jQuery, adminURL, baseURL, vidHosts, themeColors) from header.twig into a reusable, per-theme overridable bundle.
Improved Split the Logger into explicit info/error channels: new Logger::info() and a level field, info written to {host}-{date}.log and errors to {host}-{date}.error.log, 72-hour retention, and protection for server-owned log files; normal events were downgraded from error to info and the trace field now records the real caller.
Improved Refactored CloudflareProxy to accept an injected configuration array/Config instance instead of a PDO connection for reading its settings.
Improved Updated HLS/MPD playlist caching (HLS.php, MPD.php, Stream.php): cache-file path resolution moved into the shared setCacheFile() method and redundant isMP4/isMaster state mutation was removed.
Improved Updated the download script version (JS_DOWNLOAD_VERSION) to 3.3.9.
Improved Improved AjaxHelper JSON decoding so form-encoded and JSON-array request payloads are handled correctly, and customJsonDecode() now tolerates whitespace-only input.
Improved Enhanced local subtitle processing (includes/views/frontend/subtitle.php) to directly stream or serve cached WebVTT conversions for local uploads without external HTTP proxy overhead.
Improved Enhanced Parser.php to support custom poster query parameter (poster) and prioritize pre-set metadata while preserving existing video title and poster fallbacks.
Improved Migrated Ajax file upload handling (PublicAjax, VideoSubtitleAjax, SubtitleManager) to PSR-7 UploadedFileInterface and the Upload service.
Improved Streamlined InstanceCache driver connections (includes/classes/Service/InstanceCache.php) to exclusively support Redis, Predis, and Files (Filesystem) drivers, eliminating legacy drivers (Memcached, Memcache, APCu, SQLite) for optimized high-concurrency performance.
Improved Bumped player JavaScript runtime to v4.7.1 (public/assets/js/player-v4.7.1.js / .min.js) and updated player CSS (public/assets/css/player-v3.4.0.css / .min.css).
Improved Refactored video CSV import: moved parsing to frontend using PapaParse (public/assets/vendor/papaparse/5.4.1/papaparse.min.js), batching records into JSON payloads (up to 10 rows per batch) sent to the importVideosBatch endpoint, eliminating server-side file uploads, polling overhead, and import cancellation complexity.
Improved Simplified VideoImportAjax to focus on single-row JSON validation (validateImportRow()).
Improved Replaced Phpfastcache array-based tag sets (addTags) with versioned cache keys in Model.php (get, getOne, getNumRows, getTotalRows, getWhereIn), reducing Redis memory overhead and avoiding Tag Garbage Collection issues.
Improved Updated circuit breaker cooldown to 60 seconds and failure threshold to 5 across services.
Improved Optimized CloudflareProxy settings caching to avoid redundant database reads during high concurrency.
Improved Replaced in_array lookups with O(1) hash lookups in hot execution paths.
Improved Added retry limits to background download and extraction loops.
Improved Removed synchronous script loading deferral on player script elements (jwplayer.twig, plyr.twig, body_bottom.twig) to ensure consistent initialization order.
Improved Renamed default-script.twig to sw.twig and remapped its template key from default_script to sw_script in HTML::renderTemplate(), referenced from the new default-frontend-scripts.twig and default-backend-scripts.twig bundles.
Improved Merged template-loading context in HTML::renderTemplate() using array_merge in place of array_replace and reordered frontend/backend script bundles ahead of caller-supplied templates so theme overrides win.
Improved Extracted PluginThemeManagerTrait (includes/classes/Service/PluginThemeManagerTrait.php) from PluginManager and ThemeManager to centralize shared plugin/theme file extraction and version-check logic.
Improved Extracted InstanceCacheTrait (includes/classes/Service/InstanceCacheTrait.php) from InstanceCache to modularize cache driver initialization, tag versioning, and invalidation logic.
Improved Replaced ServerConfigFileUpdater with ServerConfigManager (includes/classes/Service/ServerConfigManager.php) for generating server configuration files (nginx, .htaccess) from Twig templates with prioritized key-order resolution and file locking.
Improved Refactored Master/Stream request handling: validation and header/source resolution moved into the constructor, cache file selection via setCacheFile(), isDownloadable() renamed to isDownload(), and cURL file handles closed through a shared closeFopen() helper.
Improved Consolidated response header generation in createResponseHeaders() so Cache-Control, CDN-Cache-Control, and Cloudflare-CDN-Cache-Control are always emitted consistently.
Improved Refactored the Background service around an allowDownload flag and a shared getDataVideoByLockKey() helper used by the download workers.
Improved Refactored AntiCaptcha request execution into a shared execCurl() helper.
Improved Simplified Googlephotos source resolution by removing the duplicate filterResolvedSources() pass and filtering once.
Improved Enhanced Extractor::getNewSources() with User-Agent/Accept-Language headers, a PHP 8.5 curl_close() guard, and de-duplicated sources by comparing the effective/redirect URL.
Improved Translated video CSV import UI messages in main-v4.0.1.js from Indonesian to English for consistent internationalization.
Removed Memcached from server status monitoring (SystemInfo.php, server-status.twig) and removed the MEMCACHED_CONFIG definition from config-sample.php.
Removed the AsyncHelper utility (includes/classes/Helper/AsyncHelper.php) and the targeted single-video background mode (includes/bg_get.php) because the Redis single-flight lock blocked the server upstream.
Removed the php://output (CURLOPT_FILE) streaming path in Stream::stream(), standardizing on the cURL header/write callbacks.
Fixed Fixed ASN insertion into the database that caused SQL errors when MaxMind IP data was missing, by normalizing empty ASN values to null and casting the ASN to an integer.
Fixed Fixed migrate.php and MigrationQueriesCreator.php by casting UUID() results to CHAR(36) for slug generation and guarding the foreign key drop with DROP FOREIGN KEY IF EXISTS.
Fixed Fixed subtitle edit validation and file upload handling in VideoSubtitleAjax.php.
Fixed Added transient HTTP status codes 408 (Request Timeout) and 504 (Gateway Timeout) to the cURL retry handler in Stream.php.
Fixed Fixed the Loggertrace field to record the actual caller instead of the logger itself after the logger was split into write().
Fixed Added explicit CDN cache prevention headers (CDN-Cache-Control, Cloudflare-CDN-Cache-Control) for error and non-cacheable responses in functions.php, and returned a 500 with no-store headers on fatal errors in bootstrap.php.
Fixed Fixed the shutdown handler in Swoole and RoadRunner runtimes to bypass unnecessary proc_open calls.
Fixed Handled cURL handle cleanup safely for PHP 8.5 compatibility in VideoSource, GoogleDriveRestAPI, Extractor, and poster.php.
Fixed Fixed AjaxHelper::__construct() to parse raw JSON request bodies via customJsonDecode() so batched video import payloads reach importVideosBatch instead of being dropped.
Fixed Fixed VideoImportAjax::persistImportRow() to reject rows whose main video_url fails validateUrl() and to cast id to (int) in the DataTable response.
Fixed Fixed Google Drive HLS playback handling in Master by setting the browser User-Agent for isGoogleHls() hosts instead of forcing an inline Content-Disposition redirect, and renamed the isDownloadable property to isDownload.
Fixed Fixed poster.php to short-circuit to the placeholder when a host is marked down, add a connection timeout, and record connectivity failures/successes via HostHealth while ignoring self-inflicted CURLE_WRITE_ERROR aborts.
Fixed Fixed stale .pid files not being removed on stop by guarding isRunning()/stopPid() against PID reuse.
Sep 19, 2026 (v4.8.6-p5)
AddedThemeManager service supporting dynamic active theme resolution, discovery, and automated theme synchronization (syncThemeFile, downloadThemeFile, extractThemeZip).
Added Theme synchronization endpoint (includes/views/backend/themes/sync.php) supporting background zip creation, file locking, and download streaming stored in themes/tmp/.
Added Automated theme synchronization loop to background worker (includes/bg_general.php).
Added Comprehensive theme development guide (themes/README.md) documenting folder conventions, Twig template overriding, symlinks, and composer.json Semantic Versioning.
Added MySQL replication setup and management utility scripts (resources/scripts/mysql-master-setup.sh, mysql-replica-setup.sh, mysql-replica-add-db.sh).
Added Resend HTTP REST API mailer integration (Resend.php) as an alternative email provider alongside SMTP and Mailgun.
Added Modern custom HTML error pages for HTTP 404 Not Found (public/404.html) and HTTP 502 Bad Gateway (public/502.html) with responsive design and ambient glow effects.
Added Modular Twig template widgets: light-dark-mode.twig (theme switcher) and meta-icon-prefetch.twig (SEO metadata, favicons, and prefetch links).
Improved Bumped player JavaScript runtime to v4.6.9 (public/assets/js/player-v4.6.9.js), extracting error styles to public/assets/css/error.css and optimizing button event handlers.
Improved Refactored PluginManager::extractPluginZip() and shouldUpgradePlugin() to prevent overwriting existing plugins unless the archive contains a newer version.
Improved Excluded tmp/ folder from available themes listing in ThemeManager::getAvailableThemes().
Improved Updated purgecss asset pipeline script (purgecss-dlhd.js) to ECMAScript modules (ESM) with theme JS directory scanning.
Improved Refactored and modularized CoreTrait and BackgroundTrait across Core and Service namespaces.
Improved Optimized stream chunk caching and buffer delivery in Stream.php with cached disk free space checks and dedicated cURL callbacks.
Improved Hardened Nginx server configuration template with static assets caching and custom error page routing.
Improved Hierarchical plugin routing fallback in PluginManager::dispatchPluginPage().
Fixed Fixed plugin uninstallation handling and default configuration template rendering in backend admin.
Fixed Fixed VTT subtitle header parsing and time offset calculation in includes/views/frontend/subtitle.php.
Fixed Hardened Twitch channel/video ID extraction in Extractor::twitch().
Fixed Fixed sources array structure validation in XVFSParser.
Fixed Prevented redundant re-downloading of existing plugin zip archives in PluginManager::downloadPluginFile() and sync handler.
Sep 11, 2026 (v4.8.6-p4)
Fixed Prevented ZipArchive::open() empty file deprecation warning in PluginManager by validating file existence and non-zero size before extracting or reading cached zip files.
Fixed Automatically clean up 0-byte downloaded plugin zip files.
Sep 11, 2026 (v4.8.6-p3)
Fixed Improved plugin extraction error handling and process locking in PluginManager.
Fixed Updated .htaccess rewrite rules.
Sep 11, 2026 (v4.8.6-p2)
Fixed Added MySQL auto-reconnect handling on connection drops (MySQL server has gone away).
Fixed Added flock file locking mechanism to plugin zip creation in sync handler.
Sep 11, 2026 (v4.8.6-p1)
Added Dedicated BackgroundTrait modularizing Unix/Windows PID process termination and safe graceful signals.
Improved Comprehensive code quality, cognitive complexity reduction, and system hardening across Core, Database, External, Helper, Hosting, Presentation, Service, and Views.
Improved Enhanced structured error logging using Logger::log for essential failure cases.
Improved Upgraded maxmind-db/reader dependency to v1.14.0.
Fixed Hardened database connection handling, model query exception resiliency, and statement cursor closing.
Fixed Process ID argument escaping and background daemon process management.
Sep 02, 2026 (v4.8.5)
Added Centralized Cloudflare WARP Proxy service with node and host-based SOCKS5 routing across extractors, Google Drive API, stream proxy, and Headless Chrome.
Added Mailgun HTTP REST API mailer integration as an alternative email driver (bypassing SMTP port blocking).
Added Unified Email Driver & Configuration in admin SMTP settings with dynamic switcher between SMTP and Mailgun.
Added Enhanced stream proxying with forwarded host header support.
Added Automatic fail-safe and circuit breaker protection to prevent server hanging during external video hosting outages or rate limits.
Added Intelligent cache locking to prevent server overload during traffic spikes on cache misses.
Added Direct I/O support for high-performance local file streaming.
Added Yandex Metrika and Microsoft Clarity analytics tracking integration.
Added Dedicated service health check ping endpoint.
Added Custom proxy server and bypass list configuration in Headless Chrome service.
Added Deployment and distribution guides.
Improved Overall system performance, code quality, and hardening across video hosting extractors.
Improved Faster cache initialization, reduced overhead, and high-performance serialization support.
Improved Accelerated video embed and download page rendering throughput.
Improved Background task processing reliability and process execution across server environments.
Improved Plugin hooks and dynamic widgets.
Improved Web server configuration templates with improved 404 error routing.
Improved Password reset email notifications with a modern responsive template.
Fixed Naver TV extractor DOM parsing and VOD playback URL parameters.
Fixed Shared cURL DNS cache timeout tuning to prevent persistent negative DNS lookup errors on streaming proxies.
Fixed HLS parser stream token handling and URL bypass logic.
Fixed Reduced background task disk write operations.
Fixed Stream link decryption and playback URL generation for AWS Cloud storage.
Removed The Tube, Gofile Hosts.
Aug 8, 2026 (v4.8.4)
Improved Refactored Engine Alive check and updated main JS asset (v3.9.9).
Improved Asset pipeline versioning and lockfiles updated to v4.8.4.
Improved Hosting settings and symlink management stability.
Fixed Custom hostnames setting configuration handling in Admin Panel.
Added Comprehensive system safety and audit documentation.
Aug 2, 2026 (v4.8.3)
Added PHP disabled functions checker and system alerts in Admin Dashboard.
Improved Plugin Manager service and plugin loading mechanisms.
Improved Background process execution using `shell_exec` and asset pipelines (terser, cleancss, obfuscator).
Fixed Removed debug logging in Stream handler and optimized index entry point.
Jul 29, 2026 (v4.8.2)
Added Custom Headers management UI in Admin Settings page and navigation bar.
Added INSTALLATION.md documentation guide with detailed setup and deployment instructions.
Improved Background Process Service: Refactored Background.php process runner and background task execution on Linux environments.
Improved Code Quality: Resolved PHPStan Level 8 static analysis compliance and type checks across core handlers.
Improved Server Configurations: Updated Nginx (nginx.conf.twig, nginx.conf.example) and Apache (.htaccess.twig) templates.
Fixed Core & Hosting Parsers: Improved XVFSParser, StreamParser, Core, and HeadlessChrome class handlers.
Fixed Sitemap & Database Migration: Updated sitemap.php views and web-migrate.php script handling.
Jul 26, 2026 (v4.8.1)
Added Plugin System with support for dynamic view overrides and webhook synchronization.
Added Add a server status monitor to the Dashboard and Load Balancer pages.
Added PHP 8.5 compatibility and cURL Share Handle.
Improved Stream Engine: Optimized HLS/MPD handlers, dynamic cache bypass for live streams, and trailing slash preservation in MPD BaseURL parser.
Improved Performance: Optimized subtitle and poster cache delivery via direct static redirection to reduce CPU load.
Improved Theme & UI Assets: Restructured assets to themes/ directory with dynamic symlink generation, upgraded Font Awesome to 7.3.0, and refactored dashboard colors using CSS variables.
Improved Admin Area: Restructured settings layout (Hosting, Player, Site Settings) and simplified navigation labels.
Improved Daemon & Background: Enhanced background processes and daemon synchronization for plugins and expired source link cleanups.
Improved System Requirements: Updated required PHP extensions (curl, fileinfo, filter, hash, json, mbstring, openssl, sockets, pdo_mysql). Note: Composer will prevent page access if these extensions are missing.