Skip to content
UI pluginCSS

Filename Title Checker

Checks scene titles against video filenames, compares configured GraphQL/Stash-box metadata sources, applies chosen metadata to Stash scenes, and can rename/move selected mismatches.

Druidblack
Not reviewed yet

No reviewer has approved this plugin yet. Read the source before installing, or review it for the community.

sha256 7f744cdc595e37d8d8f22f9b7509dfccc2bdd5fe20ced6b4b9327d69c819ecdd

Last updated

Oct 6, 2026
First created
Version
0.4.6-5b7ac49
Package id
filename-title-checker
Commits
2
Repo stars
2

README

Filename Title Checker for Stash

Версия: 0.4.6

UI-плагин для Stash, который проверяет соответствие Title сцены имени видеофайла, помогает находить отличия Studio, сравнивает метаданные из нескольких настроенных GraphQL/Stash-box источников и позволяет выборочно переименовывать/перемещать найденные видео.

Что нового в v0.4.6

  • Исправлено сравнение серийных маркеров: различается только разделитель между сезоном и эпизодом, но номера должны совпадать.
  • S2-E3, S2:E3, S2.E3 и S2E3 считаются одинаковыми.
  • S2-E3 и S2:E2 считаются разными; S3-E3 и S2:E3 также считаются разными.
  • Удалён ошибочный fallback v0.4.5, который полностью игнорировал номера сезона/эпизода.
  • Версия по-прежнему основана на v0.4.4 и не содержит отменённого «быстрого режима» по Stash ID.

Что нового в v0.4.4

  • В панели фильтров добавлен выпадающий список «На странице»: 20, 40, 50, 60, 80 или 100 видео. Прежнее значение по умолчанию — 50.
  • Изменение числа строк пересчитывает страницы и переводит на страницу 1; номер страницы в нижней навигации и кнопки «Назад/Вперёд» используют новое значение.
  • Выбор видео на других страницах и уже загруженные GraphQL-результаты не сбрасываются при изменении размера страницы.
  • Выбранное число строк сохраняется в localStorage браузера для следующего открытия плагина.

Что нового в v0.4.3

  • Рядом с кнопкой «Сохранить в Scene и переименовать» добавлена кнопка «Сохранить в Scene с именем файла».
  • Новый режим сохраняет выбранные GraphQL-метаданные (Studio, Date, Performers, Tags, Details, изображение, URL/Stash ID и другие доступные поля), но Title берёт из текущего имени видеофайла.
  • Title извлекается тем же парсером шаблонов, который используется Filename Title Checker для проверки файлов.
  • После сохранения выполняется обычное автоматическое переименование/перемещение по итоговым данным.
  • Если Title нельзя надёжно извлечь из имени файла, новая кнопка недоступна и данные не сохраняются.

Что нового в v0.4.2

  • Исправлен расчёт целевой Studio для сцен, у которых Scene.studio ещё не заполнена.
  • Приоритет Studio при переименовании/перемещении: выбранные GraphQL-данные → Studio Scene → Studio, распознанная из текущего имени файла → No Studio.
  • Если Studio из выбранного GraphQL-результата эквивалентна Studio в текущем имени/папке, сохраняется существующее написание и лишнего перемещения не происходит.
  • Пример: Karup's Private Collection/2016-04-08 - Karup's Private Collection - Baby - [WEBDL-720p].mp4 при пустой Studio в Scene больше не планируется к переносу в No Studio; после выбора GraphQL Studio Karup's Private Collection файл остаётся в той же папке.

Что нового в v0.4.1

  • Исправлена ошибка UNIQUE constraint failed: scene_stash_ids.scene_id, scene_stash_ids.endpoint при сохранении GraphQL-результата.
  • Для одной Scene теперь сохраняется не более одного Stash ID на каждый GraphQL endpoint.
  • Если выбранный результат того же источника содержит другой stash_id, старый ID этого endpoint заменяется новым, а Stash IDs остальных источников сохраняются.
  • Эквивалентные endpoint с отличием только в регистре или завершающем / также не дублируются.

Что нового в v0.4.0

  • Общий чекбокс в заголовке таблицы теперь выбирает и снимает выбор только с доступных видео на текущей странице.
  • Счётчик выбора показывает количество выбранных видео на текущей странице; если есть выбор на других страницах, дополнительно показывает общее количество.
  • Выбор, сделанный вручную на других страницах, сохраняется при навигации.

Что нового в v0.3.8

  • Поле Performers в результатах GraphQL подсвечивается жёлтым, если одинаковый набор актёров найден минимум в двух разных GraphQL-источниках.
  • Порядок актёров и регистр не влияют на сравнение.
  • Совпадение нескольких вариантов внутри одного источника само по себе не считается межисточниковым подтверждением.

Что нового в v0.3.7

  • Убрана оранжевая подсветка несовпадающих полей в результатах GraphQL.
  • Добавлена зелёная подсветка совпадающих Title, Studio и Date.
  • Для сравнения в первую очередь используются данные, извлечённые из текущего имени файла по шаблону Date - Studio - Title - [Quality]; если поле из имени извлечь нельзя, используется текущее значение Scene.
  • Для Studio зелёная подсветка использует те же правила эквивалентности, что и остальной плагин: например AcademyPOV = Academy POV.
  • Title с внутренними разделителями - корректно извлекается из имени файла целиком до блока [Quality].

Что нового в v0.3.6

  • Исправлено сравнение Studio в карточках результатов GraphQL.
  • Для подсветки теперь используется то же правило studioNamesEquivalent, что и для папок, имён файлов и перемещения.
  • Эквивалентные варианты вроде AcademyPOV / Academy POV, 5K Teens / 5Kteens, Free Use MILF / Freeuse MILF, Got Mylf / Got MYLF не подсвечиваются как различие.
  • Действительно другая Studio, например School POV при текущей Academy POV, продолжает подсвечиваться оранжевым.

Что нового в v0.3.3

  • исправлено поведение выбора результата GraphQL: выбранные данные теперь записываются непосредственно в карточку Scene в базе Stash через sceneUpdate;
  • кнопка переименована в «Сохранить в Scene и использовать», чтобы действие было однозначным;
  • сохраняются доступные Title, Date, Code, Details, Director, URLs и обложка;
  • выбранная Studio назначается Scene; если соответствующей локальной Studio ещё нет, плагин сначала ищет её по точному имени и при необходимости создаёт;
  • аналогично сохраняются Performers;
  • Tags из источника добавляются к существующим тегам Scene, а не удаляют локальные теги;
  • Stash ID выбранного GraphQL-источника добавляется к Scene без удаления уже существующих Stash IDs;
  • пустые поля результата не очищают заполненные поля Scene;
  • после сохранения библиотека автоматически перепроверяется, поэтому следующая проверка использует уже новые метаданные Stash;
  • текущая страница списка восстанавливается после перепроверки;
  • локальный сохранённый вариант остаётся только как резерв для расчёта переименования; источником истины теперь является сама Scene в Stash.

Что нового в v0.3.2

  • после завершения GraphQL-сверки чекбоксы файлов, участвовавших в запросе, автоматически снимаются;
  • для пакетной сверки снимаются все выбранные видео, даже если у одной Scene было выбрано несколько файлов;
  • добавлено нормализованное сравнение названий Studio без учёта регистра и пробелов;
  • поэтому 5K Teens = 5Kteens, AcademyPOV = Academy POV, Free Use MILF = Freeuse MILF, Got Mylf = Got MYLF;
  • то же правило применяется к Studio, извлечённой из имени файла;
  • если текущая папка видео отличается от Studio только пробелами/регистром, она считается корректной и файл не перемещается только ради изменения написания папки;
  • все функции v0.3.1 сохранены.

Что нового в v0.3.1

  • для каждого результата GraphQL/Stash-box теперь отображается изображение сцены, если источник его вернул;
  • изображение берётся из штатного поля ScrapedScene.image через backend Stash;
  • если источник не вернул изображение, карточка явно показывает это вместо ошибки;
  • изображения используются только для визуального сравнения и не сохраняются в localStorage, чтобы не переполнять хранилище браузера;
  • все функции v0.3.0 сохранены.

Что было добавлено в v0.3.0

  • добавлен блок GraphQL-источники со списком Stash-box/GraphQL источников, настроенных в Stash;
  • можно включить один или несколько источников для сравнения;
  • у каждой строки появилась кнопка «Сверить GraphQL»;
  • для отмеченных чекбоксами строк есть массовая кнопка «Сверить GraphQL для выбранных»;
  • запросы выполняются через сам Stash по fingerprints сцены (scene_id), без передачи API-ключей в JavaScript плагина;
  • под видео отображаются результаты каждого источника отдельно;
  • если источник возвращает несколько совпадений, показываются все варианты;
  • отображаются доступные Title, Studio, Date, Performers, Code, Director, Duration, Tags, Details и URLs;
  • отличающиеся от текущей сцены Title, Studio и Date визуально выделяются;
  • любой найденный вариант можно выбрать кнопкой «Сохранить в Scene и использовать»;
  • начиная с v0.3.3 выбранные данные записываются в Scene Stash и дополнительно сохраняются локально как резерв для расчёта имени и папки;
  • сохранённый вариант можно отменить кнопкой «Не использовать»;
  • в v0.3.0–v0.3.2 сохранение не изменяло Scene; начиная с v0.3.3 выбранные метаданные применяются к Scene Stash;
  • все функции v0.2.1 сохранены.

Как работает GraphQL-сверка

Плагин читает список источников из конфигурации Stash (stashBoxes). Внешние GraphQL endpoint и API-ключи не вызываются напрямую из браузера.

Для каждого выбранного источника плагин обращается к GraphQL самого Stash и использует scrapeSingleScene с stash_box_endpoint и scene_id. Stash выполняет поиск по fingerprints файлов сцены и возвращает найденные метаданные.

Это позволяет сравнить, например:

  • текущие данные Scene в Stash;
  • результат StashDB;
  • результат TPDB/Stash-box;
  • другой совместимый Stash-box источник, уже настроенный в Stash.

Если источник не находит сцену по fingerprints, под ним выводится сообщение «Совпадений по fingerprints не найдено».

Сохранённые данные

Кнопка «Сохранить в Scene и использовать» применяет выбранный вариант к Scene через GraphQL sceneUpdate и дополнительно сохраняет компактную копию в localStorage браузера. Для конкретной Scene запоминаются в том числе:

  • Title;
  • Studio;
  • Date;
  • Performers;
  • источник и remote ID;
  • дополнительные поля результата.

При построении целевого имени и папки плагин использует сохранённые Title, Studio, Date и Performers вместо текущих значений Scene.

Начиная с v0.3.3 база Stash обновляется. Локальная копия используется только как резерв для немедленного расчёта имени файла; после автоматической перепроверки используются уже сохранённые данные самой Scene.

Шаблон переименования

Основной шаблон перенесён из приложенного renamer-dev:

Date - Studio - Title - [WEBDL-Height].ext

Пример:

2026-08-21 - SexArt - Beside You - [WEBDL-1080p].mp4

Если для Scene выбран результат GraphQL, в шаблон подставляются сохранённые значения GraphQL. Если сохранённого результата нет — используются текущие данные Scene в Stash.

Правила:

  • используется Scene.date или сохранённая GraphQL Date;
  • используется Scene.studio.name или сохранённая GraphQL Studio;
  • используется Scene.title или сохранённый GraphQL Title;
  • высота берётся из выбранного VideoFile.height;
  • расширение исходного видео сохраняется;
  • недопустимые для имени файла символы < > : " / \\ | ? * заменяются на -;
  • отсутствующие поля пропускаются.

Специальный шаблон из renamer-dev

Для Studio 1By-Day111 сохранено правило:

Studio - Date - Performers - Title

Исполнители сортируются по имени, максимум 3, как в приложенном renamer-dev. Если выбран GraphQL-вариант, могут использоваться сохранённые Performers.

Перемещение

Обычная сцена переносится в:

<текущий Stash Library Path>/<Studio>/

Если сохранённый GraphQL-вариант содержит другую Studio, целевая папка рассчитывается уже по этой Studio.

Например:

Текущая Studio в Stash: Wrong Studio

Сохранённый GraphQL-вариант: SexArt

Целевой путь:

<Library Path>\SexArt\Date - SexArt - Title - [WEBDL-1080p].mp4

Если Studio отсутствует, используется папка No Studio.

Специальный путь Movie

Сохраняется правило из renamer-dev:

Movie -> E:\Movies\<Studio>\

Операция разрешается только если путь находится внутри одного из Stash Library Paths.

Как выполняется переименование

Плагин использует штатную GraphQL mutation Stash moveFiles и передаёт для каждого выбранного видео:

  • ID видеофайла;
  • destination_folder;
  • destination_basename.

Перед запуском отображается рассчитанный будущий путь. Файлы обрабатываются по одному; ошибка одного файла не останавливает остальные.

Связанные файлы

Версия 0.3.2 не перемещает автоматически .srt, .vtt, .jpg и .png. Обрабатывается только явно выбранный видеофайл.

Выбор файлов

Чекбокс активен, если:

  • у строки есть видеофайл;
  • после применения сохранённых данных есть Title;
  • можно определить расширение;
  • файл находится внутри одного из настроенных Stash Library Paths;
  • специальный путь для Movie, если он нужен, находится внутри одного из Stash Library Paths.

Правила сравнения Title

Сохраняются правила v0.1.5:

  • расширение файла отбрасывается;
  • регистр игнорируется;
  • пунктуация считается разделителем;
  • & и and эквивалентны;
  • апострофы игнорируются;
  • диакритика игнорируется (Qué = Que);
  • границы между буквами и цифрами разделяются (DAY2026 = Day 2026);
  • сравнение выполняется по последовательности целых слов;
  • специальных fuzzy/Levenshtein-правил нет.

Поэтому остаются несовпадениями:

  • Asphyxxia ≠ Asphyxia;
  • Angels ≠ Angles;
  • Gina Valentina ≠ Gina Valentine;
  • Step Daughter ≠ StepDaughter;
  • De Ville ≠ DeVille.

Фильтры Studio

Только в пределах той же студии — показывает несовпадения Title, у которых Studio в имени файла совпадает с текущей Scene.studio. При сравнении Studio игнорируются регистр и пробелы, поэтому, например, AcademyPOV и Academy POV считаются одной студией.

Только с разными студиями — показывает несовпадения Title, у которых Studio в имени файла действительно отличается от текущей Scene.studio после нормализации регистра и пробелов.

Фильтры взаимоисключающие.

Переход по страницам

Между кнопками «← Назад» и «Вперёд →» есть выпадающий список для прямого перехода на конкретную страницу.

Установка / обновление

  1. Распакуйте ZIP.
  2. Замените файлы Filename Title Checker в каталоге plugins Stash:
    • filename-title-checker.yml
    • filename-title-checker.js
    • filename-title-checker.css
  3. В Stash откройте Settings → Plugins.
  4. Выполните Reload Plugins.
  5. Обновите страницу браузера.
  6. Откройте Filename Check.

Важно о сохранении GraphQL-результатов

Выбранные предпочтительные данные сейчас хранятся в localStorage браузера. Поэтому:

  • они сохраняются после перезагрузки страницы;
  • не требуют изменения конфигурации или базы Stash;
  • относятся к конкретному браузеру/профилю;
  • очистка данных сайта/Local Storage удалит сохранённые варианты.

В будущей версии при необходимости это можно перенести в постоянное хранилище Stash/плагина.

Безопасность

  • API-ключи Stash-box остаются в конфигурации Stash;
  • внешние источники вызываются через backend Stash;
  • выбор GraphQL-результата сам по себе не меняет Scene;
  • фактическое переименование выполняется только после отдельного выбора чекбоксом и подтверждения;
  • физическое перемещение выполняет Stash через moveFiles.

v0.4.0

  • Сохранить в Scene и переименовать теперь выполняет обе операции подряд: сначала записывает выбранные GraphQL-метаданные в Scene Stash, затем сразу вызывает штатный moveFiles для соответствующего видеофайла.
  • Дополнительный чекбокс и запуск массового переименования после сохранения Scene больше не требуются.
  • Если файл уже имеет рассчитанное имя/папку, операция считается успешной без лишнего moveFiles.
  • После успеха скрывается только обработанная строка видео, без полной повторной проверки и без потери GraphQL-результатов других сцен.
  • Если Scene сохранилась, но переименование файла завершилось ошибкой, строка остаётся на экране для ручного повтора.

v0.4.1

  • Исправлено объединение scene.stash_ids: новый ID выбранного GraphQL-источника теперь заменяет старый ID того же endpoint вместо добавления второй записи.
  • Это предотвращает нарушение уникального ограничения scene_id + endpoint в таблице scene_stash_ids.
  • Stash IDs других GraphQL-источников при сохранении остаются без изменений.

More from Druidblack/stash-plugin

  • Jellyfin SyncDirect Jellyfin sync for scenes with Jellyfin URLs; safe fallback search when a scene has no Jellyfin URL. Performer sync remains direct-URL-only. Syncs favorites, optional reliable Stash resume position, optional generated Jellyfin covers with configurable upload delay, local saving and manual re-upload task, performer Career Start/End metadata, and adds Open in Jellyfin / Generate cover buttons. Includes bulk cover generation and automatic cover directory exclusions.