- Updated `install` script to use dynamic thread pool max threads configuration.
- Simplified the check for MariaDB version in `secure_mariadb_installation`.
- Enhanced `generate_mysql_config` function to adjust max connections based on total RAM.
- Improved error handling in `BalancerCommand` for SFTP transfers.
- Refactored `CacheEngineCronJob` to ensure proper handling of cache validity checks.
- Updated `StreamsCronJob` to utilize Redis manager more effectively.
- Enhanced `UsersCronJob` to handle Redis connections safely.
- Refactored `portal.php` to improve handling of series and favorite channels.
- Updated `PortalHandler` to streamline category ID checks.
- Improved `EpgApiController` and `PlaylistApiController` to handle legacy actions more robustly.
- Refactored `StreamRedirector` to enhance server handling logic.
- Added `StreamInterface` to define the contract for stream handling.
- Implemented `FileStream` class for file-based streaming.
- Implemented `TextStream` class for in-memory text streaming.
- Removed legacy `M3UParser` class and related resources.
- Added new tests for `AttributeStringToArray`, `Iso8601Transformer`, `Resolution`, `Byterange`, `Inf`, `Line`, and `Lines` classes.
- Updated bootstrap file to include new PhpM3u8 components.
- Replace legacy in-project M3U parser with vendored Gemorroj/M3uParser
- Initialize parser via bootstrap with proper namespacing
- Remove obsolete src/domain/Stream/M3UEntry.php implementation
- Update stream import/review mapping:
- use logo as fallback when tvg-logo is missing
- Add third-party compliance files for vendored parser:
- ATTRIBUTION.md
- LGPL LICENSE
- Add full M3uParser unit test suite:
- tag parsing
- parser behavior
- fixtures
- Add StreamService integration tests for M3U parsing/import flow
- Update test bootstrap:
- add igbinary_serialize / igbinary_unserialize polyfills
- explicitly load M3uParser bootstrap and custom test tag class
- Extract image resize logic into core/Util/ImageResizeService
- Update Admin/Player/Reseller resize controllers to use new service
- Remove legacy resize_body.php
- StreamingRequestBootstrap: unified entry for streaming endpoints
- WebApiBootstrap: unified entry for web API requests
- index.php: use new bootstrap classes instead of direct requires
- www/init.php, www/stream/init.php: mark as deprecated shims
- StatusCommand: use StreamingRequestBootstrap::init()
- autoload.php, bootstrap.php: register new classes
renderUnifiedLayoutFooter() was called twice - once from view files and
once from BaseAdminController::render(). Since admin/footer.php uses
require (not require_once), this loaded vendor.min.js twice, recreating
jQuery and destroying Bootstrap's document-level dropdown handlers.
- Add static $rendered guard to renderUnifiedLayoutFooter() for idempotency
- Remove redundant footer call from BaseAdminController::render()
- Remove split-mode (.scripts.php) mechanism from BaseAdminController
- Add rRegisteredUsers, rLine to footer globals passthrough
- Remove DEVELOPMENT constant from AppConfig.php; introduce DB_ACCESS_ENABLED
(controls phpMiniAdmin access in admin panel only, not core DB connections)
- Detach bootstrap.php from www/constants.php: load core/Config/* and
core/Logging/Logger directly; define PHP_ERRORS fallback
- Switch Logger::init() to PHP_ERRORS in bootstrap.php, stream/init.php,
RequestGuard.php; remove leftover TODO comment
- Logger: always set error_reporting(E_ALL); UI visibility controlled
separately via display_errors; rename $development -> $showErrors
- MigrationRunner: track applied/failed counts separately; failed migrations
are not marked as applied
- Replace DEVELOPMENT with DB_ACCESS_ENABLED in admin settings.php and
database.php (phpMiniAdmin gate)
- Replace DEVELOPMENT with PHP_ERRORS in CertbotCronJob
- Docs (en/ru): add DB_ACCESS_ENABLED flag description; update feature-flags,
updates_checklist, http-request-handling; remove DEVELOPMENT references
- MIGRATION.md: mark L-1 as done, remove from backlog and wave A;
unblock L-2; renumber steps
- add PHPUnit bootstrap and config under tests/
- add focused unit tests for GitHubReleases, InputValidator and FfmpegPaths
- fix GitHubReleases cache file handling when switching update channel
- document PHPUnit PHAR usage and debug run commands in RU/EN docs
- document SFTP sync for tests/ and contributor test workflow
- remove broad smoke coverage approach in favor of per-file tests
- Move data queries, permission checks, and variable setup from views
into individual admin controllers (Controller → Service → Repository)
- Each controller now prepares $rViewData before rendering the view
- Controllers handle redirects, permission enforcement, and data loading
- Remove legacy \<?php if (!isset(\$__viewMode)): ?\> blocks from ~100 admin views
- Move data preparation logic to controllers/routes
- Update admin routes and AdminTableController
- Views now contain only HTML/template markup
- Move REST API dispatch block before login redirect to prevent
API access codes from being redirected to /login
- Add SessionController for admin session management
- Renumber index.php dispatch sections (3=REST API, 4=redirect)
- Change search string from 'cert not yet due for renewal' to
'not yet due for renewal' for compatibility with both Certbot 1.x
and Certbot 2.x (which says 'Certificate not yet due for renewal')
- Extract implode() to $rOutBlob variable
Replace separate install/update build targets with a single archive that
serves both purposes. The update script (src/update) now extracts to a
temp directory, removes excluded dirs (binaries, config, user data), and
copies remaining files over the live installation.
Changes:
- Remove main_update, lb_update, lb_update_copy_files,
main_update_copy_files Makefile targets and UPDATE_EXCLUDE_DIRS var
- Move exclude dirs list into src/update (Python) where filtering
actually happens at runtime
- Rewrite doUpdate() to use tempdir extraction with try/finally cleanup
- Make delete_files_list/lb_delete_files_list gracefully skip when
LAST_TAG is empty (warn instead of error)
- Simplify CI workflows: one make command per variant instead of
conditional install + update steps
- Add ARCHITECTURE.md §5.5 documenting update flow
- Update en/ru docs: update-system.md, updates_checklist.md
- Update makefile-build.instructions.md with new targets
- Translator::get() now returns English value (not raw key name)
when a key is missing in the current language
- addMissingKeyToAllLanguages() writes English value as placeholder
for non-English language files instead of key name
- Synced 800 missing keys from en.ini to all 6 language files
(bg, de, es, fr, pt, ru) with English values as editable placeholders
Extracted hardcoded English strings from admin panel views:
- Page titles: 33 new keys
- Labels: 203 new keys
- Table headers: 113 new keys
- Buttons: 47 new keys
- Tooltips/placeholders: 301 new keys
- JS alerts: 3 new keys
- Options/spans/misc: 103 new keys
Total: ~800 new translation keys (was 762, now 1528)
- ServersCronJob: guard against null watchdog_data from json_decode,
use ?? [] for cpu_average_array access
- UsersCronJob: safe json_decode for php_pids — check is_array()
before array_map to prevent TypeError on null
- CacheCronJob: suppress mkdir errors with @, check is_dir() before
chown/chgrp to handle permission-denied on LB servers
- settings.php: htmlspecialchars() array guard for api_ips, is_array()
guards for already-decoded allow_countries and allowed_stb_types
- api.php: null-safe parserelease title access, @var Database phpdoc
annotations for closures with use (&$db)
- movie.php: !empty() for RequestManager import key access
- MovieController.php: default variable declarations before compact(),
safe key access for direct_source and stream_status, proper movie
fetch with redirect on invalid id
- MovieService.php: null coalescing for movie_symlink, direct_proxy,
bouquet_create_list, category_create_list, bouquets, category_id