До змісту документації

Керування R3el

Якщо обробка зупиняється без збігів або з невирішеними кількома збігами, у стовпці Action відповідного рядка з’являється поле введення й кнопка TMDB ID. Введіть додатний ID фільму, щоб отримати точний запис TMDB, навіть якщо його не було серед початкових кандидатів. Завдання виконується у фоні й використовує звичайні етапи каталогу, завантаження зображень, переміщення та пріоритету форматів. Невдалий пошук показує помилку й зберігає старі результати для виправлення. Для активних, уже розв’язаних, Ignore та Delete рядків ручне зіставлення недоступне.

Сайт відкривається сторінкою Catalogue. Меню має порядок Catalogue, Control, Event log. Сторінка керування доступна за /control.

Посилання Catalogue поруч із логотипом показує чотири останні додані елементи. Стрілки перегортають попередні й наступні групи по чотири. Пошук за назвою знаходить її підрядок та показує картки з постером, назвою і роком (п’ять у ряд) в окремій панелі Search Results. Картка відкриває сторінку фільму з постером, описом та секціями Director, Producers, Cast, Files. Дані беруться зі збереженого каталогу й локальних зображень без нового запиту TMDB.

На сторінках фільмів та окремих епізодів є кнопка Watch. Кожне натискання відкриває VLC і створює окрему подію перегляду, зокрема повторного. Останній перегляд показується як Watched: YYYY-MM-DD під датою та тривалістю за збереженою датою UTC. Для непроглянутих елементів відображається Watched: Never. На сторінці епізоду зображення й назва розміщуються в одному рядку, інші відомості — нижче.

Таблиця watched зберігає унікальний ID події, ID фільму чи епізоду та UTC-час натискання. Для створення таблиці виконайте встановлення чи оновлення служб.

Watch використовує збережений шлях до відео, замінюючи початкове /exports/ на /imports/, наприклад r3el-vlc:///imports/disk1/Movie.mkv. Інші префікси не змінюються. Шляхи не показуються на сторінці; фільми з кількома файлами мають вибір частини/версії. Субтитри не пропонуються для відтворення.

На Linux-комп’ютері з Chrome і VLC один раз виконайте від імені свого звичайного користувача (без sudo) з каталогу вихідного коду:

python3 scripts/vlc-link.py --install

Або скопіюйте лише scripts/vlc-link.py на цей комп’ютер і запустіть з --install. Потрібні Python 3, VLC (vlc у PATH), xdg-mime з xdg-utils і update-desktop-database з desktop-file-utils. Інсталятор оновить кеш застосунків і зареєструє обробник посилань r3el-vlc: для користувача за специфікацією desktop entry. Натисніть Watch та підтвердьте запуск зовнішньої програми в Chrome. Медіафайл має бути змонтований за шляхом /imports/... на локальному комп’ютері. Відкривається локальний файл у VLC, а не мережевий потік із сервера R3el.

Title Search, Search Index, Category Search і Random Search розміщені в одному рядку. Random Search має одну кнопку Search, що замінює останні додавання чотирма випадковими фільмами, серіалами чи епізодами (або всіма записами, якщо їх менше чотирьох). Кожне натискання вибирає новий набір без дублікатів усередині набору. Картки епізодів використовують постер серіалу й посилаються на його сторінку. Індекс має Numbers and Symbols на окремому рядку, а алфавіт переноситься нижче, групуючи назви фільмів і серіалів за першим символом (не назвами епізодів). Початкові пробіли ігноруються. Результати індексу використовують ті самі картки й кількість збігів. Літери без назв пропускаються, навколо кожної літери — по два додаткові пробіли. У Title Search поле Type займає окремий рядок. Середній блок підлаштовується під вміст, Category Search заповнює вільну ширину перед Random Search, а на вузьких екранах блоки складаються вертикально.

r3el-control.service — окремий Jinja2-сервер звітів. Він показує журнал MariaDB незалежно від того, працює чи зупинений сервіс ідентифікації, та не потребує Qwen. На сторінці Control логотип стоїть поруч із вертикально вирівняними налаштуваннями в рамці. Порожня робоча область містить Source (за замовчуванням DR3el.FILM_DIR), Destination (DR3el.MEDIA_DIR), числове поле Batch Size (довільне додатне ціле, типово 10) та кнопку New Batch. Максимум — 4 294 967 295 відповідно до місткості стовпця БД. Кнопка надсилає каталоги й розмір на сервер ідентифікації через ZeroMQ. Підписи й відповіді формуються Jinja2; спільні стандартні значення — у DR3el, назви повідомлень — у DMessage. Логотип R3el входить до ресурсів сервера. New Batch одразу починає ідентифікацію та зіставлення TMDB без проміжної паузи.

Сервер керування — вебзастосунок для людини. Відкриття сторінки чи оновлення статусу ніколи не створює пакет. Після перезапуску ідентифікатор відновлює перервану обробку зі збережених параметрів пакета й контрольних точок файлів. Завершені пакети й явні Stop Batch залишаються бездіяльними. Лише надсилання New Batch створює новий вибір. Для порожньої чи завершеної робочої області ця дія доступна, для активної — вимкнена. New Batch замінює завершену робочу область новим вибором, не змінюючи каталог, медіа й історію подій. Завершення фонової обробки не очищує робочу область та не починає інший пакет автоматично.

Якщо в робочій області є пакет, основна сторінка показує імена файлів та збережені стани в порядку вибору. Перші стовпці — # (з одиниці) і Updated (MM-DD HH:MM у локальному часовому поясі браузера). Updated означає останню збережену зміну файлу, а не оновлення сторінки. Для старих записів без часу відображається —; оновлення програми не вигадує історичних дат. Під час обробки секція Control сіріє, збережені каталоги й розмір показуються як незмінний текст, а New Batch недоступна. Після завершення, помилки чи зупинки редаговані поля повертаються з попередніми значеннями, навіть для порожніх пакетів. Автоматичне опитування активує New Batch після завершення. Заміна й новий вибір фіксуються разом: невдалий вибір або транзакція залишають стару робочу область без змін.

Таблиця файлів закінчується стовпцем Action із кнопкою TMDB ID або Replace Local Media за потреби. Випадаючого списку Pending / Approve / Ignore / Delete більше немає. Clear Current Batch доступна за наявності робочої області: вона безпечно зупиняє обробку перед очищенням робочих записів, зберігаючи каталог, імпортовані медіа й події. Під налаштуваннями жирний жовтий рядок Current Task: показує останнє повідомлення Event Log поточного пакета й посилання на подробиці.

Сервер обробляє групи до 10 файлів у вибраному пакеті. Кожна група повністю проходить ідентифікацію, TMDB, вибір LLM та повтори нульового результату, перш ніж почнеться наступна. Решта файлів мають Pending. Остання група може бути меншою за 10.

Stop Batch запитує узгоджену зупинку автоматичної обробки або ручного завдання TMDB ID. Запит фіксується незалежно від ексклюзивного блокування робітника. Поточна операція безпечно завершується, після чого робітник не починає інший файл чи повтор ідентифікації. Поточний запит до моделі/API має завершитися або вичерпати час очікування; кнопка не завершує служби примусово й не перериває транзакцію каталогу чи переміщення файлу. Готова робота зберігається, файли Pending не змінюються, пакет отримує cancelled, а інтерфейс показує стан зупинки. Запити зупинки витримують перезапуск і не відновлюються мовчки повторним запитом зіставлення. Це не очищає робочу область і не додає дії Resume.

Після ідентифікації групи сервер автоматично шукає TMDB за збереженою назвою й роком для файлів Pending та Approve. Ignore і Delete пропускаються без файлових операцій. New Batch і Stop Batch стоять разом під Refresh. Кнопки Process Batch немає; невирішені відповідності виправляються через TMDB ID. Фоновий робітник утримує блокування обробки; зміни дій під час його роботи отримують конфлікт. Повторні подання для активного пакета повертають те саме завдання. Результати зберігаються для кожного файлу в міру завершення пошуку.

Після зіставлення посилання Match Results показують 1 match, No matches або N matches за загальною кількістю результатів TMDB. Match failed веде до помилки, Skipped не має посилання. Сторінка подробиць показує шукані назву/рік і картку кожного завантаженого кандидата: постер, назва/рік, мова, рейтинг/голоси, жанри, опис, дата виходу, оригінальна назва, посилання TMDB. Один загальний результат — Resolved. Кілька результатів запускають LLM-запит multiple_choice із пронумерованими назвами й уривками опису (приблизно 160 символів, до кінця речення). Модель викликає submit_multiple_choice(number) через MCP. Тимчасовий локальний прослуховувач ZeroMQ перевіряє ціле число відповідно до активної серверної спроби й кількості кандидатів та відхиляє застарілі/повторні подання. Як аргумент інструмента доступний лише номер. Правильний вибір зберігається як Resolved; 0 означає відсутність упевненого вибору. Після успішного вибору посилання 1 match показує тільки вибраний фільм, також у збереженому JSON; інші кандидати видаляються з робочого результату. Звичайні текстові числа не приймаються як подання.

Некоректні відповіді та помилки з’єднання залишають Ambiguous; вибір можна повторити без повторного пошуку TMDB. Використовується перша завантажена сторінка. Control бере R3EL_LLM_URL із /etc/r3el/server.env (типово інференс LlamaSrv за адресою http://127.0.0.1:51001; див. підключення до моделі). Відсутні метадані мають явні заповнювачі, на малих екранах блоки стають вертикальними. Збережений JSON доступний у згорнутій секції. Якщо завантажено лише першу сторінку більшого набору, указується кількість показаних результатів. Відкриття чи оновлення сторінок читає збережений результат без запиту до TMDB. Повторне зіставлення використовує готові успішні пошуки й повторює невдалі. Зміна дії файлу очищує його результат. Pending/Approve без ідентифікації отримує Match failed. Відсутня ідентифікація чи помилка пошуку не припиняє обробку інших файлів.

Нуль результатів TMDB автоматично запускає новий діалог ідентифікації імені з типовими запитами про поточну дату, фокус, ім’я файлу та подання. Попередні ідентифікації й помилки пошуку не входять до повідомлень LLM. Нові назва/рік знову шукаються, навіть якщо ідентичні попереднім. Стовпець Retries відображає до трьох додаткових ідентифікацій після першої. Якщо третій повтор не дає збігів, TMDB шукає остаточну назву з роком на один менше, потім на один більше. Перший пошук сусіднього року з рівно одним фільмом приймається. Кілька результатів проходять звичайний вибір LLM; невирішений вибір залишається для ручного TMDB ID. Лише нуль результатів переходить до наступного року. Якщо в обох немає результату, скористайтеся TMDB ID. Файл переходить у unresolved_llm, і подальші запити зіставлення не повторюють вичерпані спроби. Інші файли продовжують оброблятися. Помилки API не вважаються нульовими результатами; невдалі запити для сусідніх років можна повторити, не повторюючи готові роки. Status показує Pending, доки тривають повтори, пошук сусідніх років і вибір LLM. Лічильники повторів та результати фіксуються з подіями, витримують перезапуск; встановлення/оновлення додає media_files.retries. Виправні спроби всередині одного діалогу — окремий лічильник.

POST /workspace/match приймає batch_id та швидко повертає HTTP 202 з accepted: true і job_id. GET /workspace/match/status/<job_id> повертає running, completed або failed. Браузер опитує статус і збережений прогрес кожні дві секунди, після завершення оновлює таблицю на місці. Перезавантаження сторінки під час роботи продовжує опитування без нового завдання. Помилки зупиняють опитування й пропонують переглянути збережені результати. Робітник має власне з’єднання з БД та не залежить від браузера; завершення служби чекає його закінчення. Статус останнього завдання зберігається в пам’яті. Після перезапуску старий ID завдання повертає 404; збережені результати залишаються, а обробку можна повторити. GET /matches/<batch_id>/<file_id> показує збережений збіг. Зміна дії сама не виконує файлових операцій. POST /workspace/actions приймає batch_id, file_id, action і повертає готовність як JSON.

Після прийняття New Batch сторінка Control один раз перезавантажується через дві секунди, щоб показати знайдені файли, і повертається на /control без прапорця прийняття: оновлення не надішле пакет знову. Під час автоматичної обробки таблиця оновлюється кожні дві секунди до завершення чи помилки. Випадаючий Refresh пропонує Manual (типово), 5 секунд, 30 секунд, 1 хвилину та кнопку Update. Оновлюються тільки таблиця файлів, стан кнопок і час останнього читання; сторінка й введені поля не зникають. Update змінює інтервал без навігації. Опитування чекає, якщо меню дій має фокус або триває збереження. Вибраний інтервал залишається в URL, зберігається після New Batch і завершення зіставлення. Панель Current Batch має таблицю в окремій рамці; довгі пакети прокручуються в ній із закріпленими заголовками. Час Updated праворуч заголовка (MM-DD HH:MM:SS) — час останнього читання робочої області в локальній зоні браузера, а не остання зміна файлу. Pending зберігається до фіксації результату. Читання використовує спільний інтерфейс без ексклюзивного блокування процесора. Помилка БД показує Workspace unavailable без кнопки.

New Batch замінює завершену робочу область, а запуск служби відновлює перерваний пакет. Каталог призначення зберігається в пакеті для автоматичного імпорту. Перед запуском установіть --llm-url або R3EL_LLM_URL сервера ідентифікації. Негайна відповідь accepted означає тільки прийняття до обробки. Додаткові запити під час роботи отримують busy і не стають у чергу. Прослуховувач увесь час приймає MCP-подання; після завершення сервер знову бездіяльний. Перевіряйте /events та журнал служби щодо помилок до створення робочої області. Тайм-аут означає невідомий результат, тому автоматичного повтору немає.

POST /batches обробляє форму; успішні подання переспрямовують на GET, щоб оновлення сторінки не повторило команду. Обидві служби підтримують --zmq-endpoint для нестандартної адреси. Дивіться повідомлення ZMQ.

Встановлення й оновлення копіюють модулі Python і шаблони, ініціалізують схеми подій та робочої області й запускають Control з автозапуском. Відкрийте http://<server>:42220/. Типово слухаються всі інтерфейси через http у DR3el.CMDB_NETWORK, з урахуванням робочого JSON (конфігурація). Окремий сервер пакетів залишається зупиненим і без автозапуску до явного запуску. Видалення прибирає обидва R3el unit-файли, але зберігає незалежно керований сервіс моделі LlamaSrv.

Журнал показує до 500 відповідних подій, починаючи з нових. Списки Category, subcategory й event name розміщені в другому рядку заголовка таблиці та фільтрують усю історію БД до обмеження 500. Список Event / source обирає назви подій на кшталт tool_received і tool_started. Рядок спочатку показує джерело, наприклад FileMgr - files_retrieved. Можна вибрати ручне оновлення або автоматичне через 5, 30, 60 секунд. Посилання відкриває повний текст, джерело, PID, версію програми й батьківську подію. Повна сторінка форматує JSON з відступами й зберігає звичайний текст. Для reply_received поле Message показує декодовані міркування LLM із Markdown (заголовки, списки, виділення, код, таблиці, розриви рядків). Повний зафіксований payload залишається під заголовком JSON. Вбудований HTML екранується, небезпечні схеми посилань блокуються. За відсутності міркувань показується окреме повідомлення. Дати перетворюються в локальну зону браузера з переходами літнього часу; у БД залишається UTC, а часові елементи містять явний UTC-зсув.

Події TMDB

Перед кожним запитом пошук фільму створює tmdb_search у категорії TMDB / Search з ім’ям файлу, назвою, primary_release_year, сторінкою й endpoint. Подія tmdb_result у TMDB / Result посилається на відповідний пошук; подробиці містять відповідь або помилку, назву/рік запиту й результат. Пошук пов’язаний з початковою подією пакета; обидві події мають ID пакета/файлу. Секрети й заголовки авторизації ніколи не журналюються.

Події результату фіксуються в одній транзакції зі збереженим збігом. Очікувані помилки пошуку мають рівень ERROR; нуль або кілька збігів — INFO. За відсутності конфігурації/ідентифікації помилка посилається прямо на пакет, бо запиту не було. Ignore/Delete та повторне використання збережених результатів не породжують нових подій пошуку. Кожен фактичний повтор має власну пару подій. Читання збережених результатів не створює подій зіставлення.

Обробка каталогу записує Artifact / Download для завантаження, повторного використання чи помилки постера/фону, DB / Create Record при фіксації метаданих і файлів, File / Move після видалення джерела або помилки. Події мають контекст пакета/файлу й посилання на пакет. Подія каталогу входить до транзакції запису, подія переміщення — до контрольної точки завершення. Уже готові файли не дублюють ці події після поновлення пакета.

Шаблони повідомлень

Стовпець Message використовує Jinja-шаблони в r3el/server/templates/messages/. EventPages обирає <event-name>.html, якщо він існує, інакше default.html. Вибір залежить лише від назви події, а category/subcategory використовуються тільки для фільтрації. Типовий шаблон показує JSON із відступами або звичайний текст без змін, не більше 1 200 символів і три крапки. Увесь прев’ю є посиланням на подію; окремого Full event немає, зокрема для подій життя сервера.

Кожен власний шаблон повністю керує клітинкою Message. Весь її текст посилається на /events/<event_id> без окремого Full event:

Подія / шаблон Відображення
files_retrieved Retrieved filenames (XXX): foo.txt, bar.xls, ... — кількість, перші дві назви в збереженому порядку та буквальне ....
batch_started Batch started with size: XXX, із data.batch_size.
batch_completed Batch completed with size: XXX, unresolved_llm: YYY, із data.count і data.unresolved_llm.
attempt_started Filename: …, з context.filename.
reply_received Filename: …, Reasoning: … — reasoning_content (до 20 символів або першого розриву рядка), далі буквальне ....
tool_completed Tool completed. Attempts: XX, Filename: …, із context.attempt та context.filename.
submission_accepted Submission accepted. Attempts: XX, Filename: …, Title: …, Year: XXXX, Confidence: XX., з контексту спроби й data.identification.
tool_received Tool received. Attempts: XX, Filename: …, Title: …, Year: XXXX, Confidence: XX., із контексту й поданого data; невідоме поле — —.
item_started Filename: … із context.filename.
item_completed Filename: … із context.filename.
batch_failed Лише data.error.
tmdb_search Посилання з назвою файлу, назвою й роком; подробиці мають параметри запиту.
tmdb_result Посилання з файлом і кількістю збігів чи помилкою; подробиці мають результат.
file_move Файл, шляхи джерела й призначення, результат або помилка переміщення.
file_delete Файл, шляхи дублікатів, пріоритетне відео та результат видалення.
artifact_download Файл, тип зображення, URL джерела, локальний шлях і результат завантаження/повторного використання.
db_create_record Файл, назва, TMDB ID, локальний шлях і результат збереження каталогу.
batch_cancelled Batch cancelled.

batch_resumed та інші події без спеціального шаблону використовують типовий. Впевненість запитується, приймається, зберігається й показується як ціле від 0 до 10. Події tool_received показують подане значення до перевірки; відсутні поля відображаються як —.

Кожен шаблон отримує:

  • event: метадані події та початковий content.
  • message.payload: декодований JSON або початковий рядок, якщо це текст. Події EventWriter мають message.payload.context і message.payload.data.
  • message.text: повний JSON із відступами або початковий текст.

Використовуйте простий HTML і Jinja-вирази для полів, написів та макета; обчислення залишайте в Python. HTML екранується, відсутні обов’язкові змінні й помилки шаблонів не приховуються. Типовий шаблон вибирається лише за відсутності спеціального, не тоді, коли той несправний.

Щоб налаштувати подію, додайте іменований шаблон і його шлях до списку modules у scripts/install-services.sh, щоб встановлення й оновлення його розгортали. Повна сторінка події незалежно від скороченого відображення містить увесь payload; reply_received додатково показує форматовані міркування.

Окремий запуск

Для запуску/зупинки встановлених служб використовуйте scripts/services.sh start або scripts/services.sh stop із вихідного чи встановленого каталогу. Помічник викликає sudo за потреби. Запуск спершу піднімає Control, потім сервер пакетів; зупинка виконується в зворотному порядку. LlamaSrv керується окремо: скрипт його не запускає й не зупиняє. Помилка команди зупиняє скрипт і повертає код помилки. Сервер починає в режимі очікування з MCP/ZeroMQ; дивіться запуск ідентифікації.

Після встановлення залежностей, ініціалізації схеми подій та налаштування DB_HOST, DB_USER, DB_PASSWORD, DB_NAME:

.venv/bin/python -B -m r3el.server.ControlServer --host 127.0.0.1 --port 42220

GET / читає MariaDB й показує або керування пакетом, або збережену робочу область. /events — журнал, /events/<id> — окрема подія. /health перевіряє живучість HTTP без звернення до БД; помилка БД на сторінці звіту повертає HTTP 503. Неправильні фільтри — HTTP 400, відсутні події — HTTP 404. Журнал служби містить подробиці помилок БД:

journalctl -u r3el-control.service -f

ControlServer обробляє HTTP та окремі з’єднання БД на запит. EventPages відображає шаблони поряд із сервером. EventReport визначає фільтри категорій, EventLogDb читає через спільний DbMgr.

Облікові дані TMDB

Встановлення й оновлення читають TMDB_TOKEN та TMDB_KEY із /root/.tmdb, підтримуючи звичайні та взяті в лапки присвоєння й необов’язкове export. Файл обробляється як дані, не виконується. Обидва значення обов’язкові й атомарно встановлюються в /etc/r3el/tmdb.env поруч із database.env, власник root, режим 0600. Обидві служби завантажують його через systemd. Видалення R3el прибирає встановлену копію, але не чіпає /root/.tmdb. Відсутні чи неправильні дані зупиняють інсталятор до зупинки служб або заміни модулів.

Пошук фільмів використовує TMDB_TOKEN як Bearer token, а TMDB_KEY зберігається разом із ним. Для окремого запуску задайте TMDB_TOKEN у середовищі. Дивіться пошук фільмів та автентифікацію TMDB. Використовуються назва й primary_release_year; рівно один загальний збіг визначає фільм, кілька — вибір LLM. Цей крок не включає пошук серіалів.

Спільні довідники TMDB

tmdb_movie_genres зберігає TMDB ID жанрів і англійські назви. tmdb_languages — ISO 639-1, англійські й власні назви мов. Ці довідники спільні для програми, не залежать від пакетів та готові до майбутнього перегляду. Match Results читає їх через TMDBReferenceDb. Невідомий ID/код відображається як ID/код без вигаданої назви.

Встановлення й оновлення явно створюють таблиці, завантажують обидва довідники, перевіряють і оновлюють їх однією транзакцією. Збій завантаження/запису зберігає старі дані. Оновлення не видаляє ID, які TMDB більше не повертає, щоб не зламати медіапосилання. Немає фонового оновлення або API-запиту під час відкриття сторінки. Для ручного оновлення за наявності БД і TMDB_TOKEN: .venv/bin/python -m r3el.activity.TMDBReferenceRefresh.

Дані походять із TMDB жанрів фільмів і мов. Постери використовують збережений шлях та задокументований формат URL зображення; браузер завантажує публічне зображення без секретів API.

Пошук TMDB у командному рядку

Шукайте назву з необов’язковим чотиризначним роком:

.venv/bin/python scripts/query-tmdb.py "Superman"
.venv/bin/python scripts/query-tmdb.py "Superman" 2025

Для серіалів додайте --type tv; типовий тип — фільм (--type movie). Для серіалів рік обмежує дату першого виходу, а не роки всіх епізодів.

.venv/bin/python scripts/query-tmdb.py --type tv "Breaking Bad"
.venv/bin/python scripts/query-tmdb.py --type tv "Breaking Bad" 2008 --raw

Сирий результат серіалу містить дані серіалу, титри, ключові слова, зовнішні ID, альтернативні назви, вікові рейтинги, переклади, зображення й відео, але не завантажує кожен сезон та епізод окремо.

Для окремо встановленого CLI з власним віртуальним середовищем:

sudo scripts/install-cli.sh
/opt/prod/r3el/bin/query-tmdb "Superman" 2025

Опція -r або --raw отримує повні дані фільму для кожного збігу першої сторінки та виводить JSON з відступами. Результати зберігають поля пошуку й додають тривалість, бюджет, касу, жанри, компанії, колекції, титри, ключові слова, зовнішні ID, альтернативні назви, дати випуску, переклади, зображення й відео через TMDB append_to_response. Метадані пагінації залишаються; відгуки, рекомендації та наступні сторінки не завантажуються:

/opt/prod/r3el/bin/query-tmdb -r "Superman" 2025

Інсталятор створює або повторно використовує /opt/prod/r3el/.venv, встановлюючи лише CLI-залежності Python і модулі. Він не створює БД, не встановлює й не запускає служб. Команда працює з будь-якого каталогу без активації venv або збереження розробницької копії коду. CLI спершу читає TMDB_TOKEN із середовища, потім /etc/r3el/tmdb.env, потім ~/.tmdb (для root — /root/.tmdb). Файли читаються як дані, не виконуються; недоступні пропускаються, права доступу не змінюються.

Скрипт використовує той самий пошук за primary_release_year, що й пакет, і показує пронумеровані результати з датою, мовою, рейтингом, посиланням TMDB і повним описом із перенесенням рядків. Частковість першої сторінки та відсутність збігів позначаються явно. Код виходу 1 означає помилку TMDB/налаштування, 2 — неправильні аргументи. CLI не звертається до LLM і не змінює робочу область. Інсталятор/оновлювач розгортає скрипт разом із помічником служб.