Repository navigation
Use any OpenAI-compatible server for the AI features, not just Ollama.
Added
- Use any OpenAI-compatible server for the AI features, not just Ollama (#616). Settings → Integrations now offers Provider: Ollama | OpenAI-compatible. The OpenAI-compatible option takes a base URL (including
/v1), an optional API key, a text model and a vision setting, and drives all three AI features: the title-language guess, Arena explanations and the vision check. One provider is active at a time. The same code path serves local servers (Ollama's own/v1, Unsloth Studio, llama.cppllama-server, LM Studio, vLLM) and hosted APIs (OpenAI, OpenRouter), with nothing to configure per model: subarr works out what each server accepts (JSON mode or schema, how to switch reasoning off) and remembers it. A model that reasons by default never comes back as a silent empty answer; subarr retries once with room to finish, then reports the problem instead of an empty result. Test connection checks six things one by one (the server answers, the key is accepted, the model is listed, JSON comes back, reasoning is off, vision works) and says which one failed. The API key is a secret: masked when shown, never logged, never sent in telemetry, and never overwritten by its own mask when you save. Telemetry reports only which kind of provider is in use. Tested live against Ollama's/v1(gemma4:12b-it-qat) and OpenRouter (google/gemini-2.5-flash, a reasoning model, andopenai/gpt-4o-mini); OpenAI direct, Unsloth Studio andllama-serverare implemented from their documentation and source and have not been tested live yet. Pulling and unloading models stay Ollama-only, because the OpenAI API has no equivalent. Thanks to @ErroneousBosch for asking for Unsloth Studio support.
Changed
- The title-language guess now names the library and the path inside it (#616). The prompt used to send the title and the full folder path; it now sends the library name and the path relative to that library's root, for both providers. On a 60-title sample scored against Sonarr and Radarr's original language, the old and new prompts scored the same on
gemma4:12b-it-qat(33 of 60 each, 27 of 30 English and 6 of 30 non-English), so this does not change accuracy on that model.
Fixed
- Test connection failed with an error on an integration set up through environment variables (#649). Settings leaves out fields that come from the environment, so on a card where every field was set that way (or where the URL was, and you typed only the key) Test connection sent an incomplete request and got a validation error back instead of a result. It now tests what is actually configured: any field you did not type is taken from the current settings, and anything you did type still wins, so testing a change before saving works as before. With no URL configured at all it now says so. This also fixes Jellyfin, whose stored API key was never used by the test, so a Jellyfin key set in the environment or shown masked always tested as empty.
- The AI integration was labelled "Ollama" even when an OpenAI-compatible server was in use (#616). Settings and the Home integration tiles now say OpenAI-compatible when that provider is active. Ollama installs see no change.
- A model that answered the language question with a bare word such as "No" was stored as a language (#616). "no" is also the code for Norwegian, and the same goes for a handful of other short English words (am, as, be, ha, haw, he, hi, id, is, it, my, no, so, yo). A bare reply that is one of those words is now treated as no answer and the title is asked again; a proper structured reply naming one of those languages is still accepted. Titles already stored this way are re-asked automatically on the next start.
- The Review page re-read the whole library every five minutes when nothing could be relinked (#641). The relink check above walks every library to look for moved files. On an install whose missing files are ordinary upgrades and renames, which can never be relinked, it repeated that walk on every Review visit, five minutes apart: about 30 seconds of reading from the share for 6,000 files, to find nothing each time. A "nothing to relink" answer is now remembered until subarr's own records or your libraries change: a file goes missing or is cleaned up, a verification or probe result is added or removed, or a library is added or moved. Changes on the share itself, such as files copied to a new location, are picked up when the answer is rechecked after six hours, so a relink they make possible can take up to that long to be offered. A walk where any library could not be read is never remembered, and Relink all always checks afresh. Nothing to configure.
- The orphan cleanup refused forever after a mount or library move (#638). If most of your saved paths pointed at a layout that no longer existed (the rows were recorded while a mount was misconfigured, say), the cleanup on the Review page saw "more than half the files are missing" and held back every time, and re-walking the library could never clear it. Those rows were not garbage: each audio-language verification is work you did by hand, and the files were usually still there under a new path. Review now looks for them. When a group of stale paths lines up with files that exist today under one consistent rewrite (for example
Old/Anime/...is nowAnime/...), it shows a card with the old and new path, how many files matched by path and size and how many by path only, and a sample you can expand to the full list. Relink all moves those verifications and probe rows onto the files at their new paths, keeping the language, source, confidence and date, and noting where each came from. A rule is offered only when at least three verified files agree. A file that already has a verification at its new path is left alone and that one wins. Rows whose old path had a recorded size are matched only when the size is identical, and a rule with any size mismatch does not move its unchecked rows. Nothing changes until you click, and the existing safety check is untouched: a dropped mount still matches nothing and still holds the cleanup back. Whatever cannot be found goes through the normal cleanup afterwards. A movie library rooted at its movies folder (so every movie sits one folder deep, as inAppleseed (1988)/Appleseed (1988) Bluray-1080p.mkv) is now matched too, as long as the file size is identical. The relink check also reports why the remaining stale rows were not offered (no file with that name, size changed, more than one candidate, and so on), so a report can say what is going on without anyone opening the database. Thanks to @ErroneousBosch for the report and for laying out exactly what their data looked like. - Tuning Lab's "Pick a media file" dialog only listed the default library (#635). With more than one library configured, Browse… on a sweep always opened the default library's tree, and the root breadcrumb always returned there. The dialog now offers the same library switcher as Library → Browse, and a chosen file keeps the
@library/...path the sweep already accepts. A single-library install looks the same as before.