- A subtitle track's name went on ffmpeg's command line through
escapeshellcmd(), which leaves spaces alone: "English (SDH) forced"
became three arguments and the movie's encode failed. Each is one
escapeshellarg()'d argument.
- A quote in a created channel's source path ended the path in ffmpeg's
concat list, which then did not parse.
- Deleting a recording killed by grep 'Record[<id>]': bare brackets are
a character class, which never matched the process's title, and the
recording went on to its end.
- Archive cleanup took any entry whose name began with a stream's id for
that stream's archive: a recording's "<id>.ts" beside it was removed.
- The RTMP endpoint's shutdown never saw $db, so it closed nothing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Admin global search: SearchAjaxController asks CategoryService::getAllByType
(null) for every category type, as the method's docblock and body allow,
but the cs-fix pass typed the parameter `string`. Any search with results
threw and returned nothing.
- Movie and episode encoding: startMovie hands movie_subtitles to
buildSubtitleImport(string), and titles saved without subtitles store NULL.
The TypeError ended the queue daemon, which stopped encoding the whole
movie queue.
- Line authentication: every category save or reorder deleted the
category_map cache, which only the heavy cache pass rebuilds, up to five
minutes later. Meanwhile getUserInfo passed igbinary_unserialize(false) to
resolveCategoryIds(array) and player_api, the Ministra portal and probe
failed for every line. Category saves no longer delete the map (which
categories a bouquet reaches does not depend on a category's name, type or
order), and a missing map now means no categories instead of an error.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V2uBUbGApb4A7Rbcoi7dxA