Skip to content

v0.8.0

Choose a tag to compare

@github-actions github-actions released this 14 Aug 14:42
· 21 commits to main since this release
8dcd5ff

Films: the release where Transpondarr tracks both anime formats as themselves.
Add a film from AniList and it is searched on its title and release year,
grabbed, and filed into a Movies library of its own; episodes keep going where
they went before, and gain a flat filing option for the scanners that prefer it.
The REST resource series is also now titles, which API clients need to know
about.

Quality profiles are now chosen when you add a title rather than reassigned
afterwards, and the controls around them hold up β€” the chip survives a slow or
failed load, and names no longer collide only by case.

Added

  • Anime films can be added, searched and grabbed. A film in AniList search
    or on the Discovery chart is no longer reserved and greyed out: adding one
    tracks it like any other title, and the same pipeline searches, grades, grabs
    and imports it. A film's releases are matched on its title and release year,
    which is what they are named for, so a manual search lists what is available
    and a monitored film joins the scheduled search queue and the recent-feed poll
    alongside your series, backing off the same way when nothing turns up. Format
    decides and episode count never does, so a one-episode OVA or special is a
    series and stays one. Two things to expect: automation waits for a release
    year rather than guessing at one
    β€” a film whose year AniList has not
    published yet is listed as ineligible until a metadata refresh fills it in,
    and a release naming a different year is listed with that mismatch as its
    reason β€” and a batch or season pack is held back for the same kind of reason,
    being as likely to be the parent series' pack as a multi-part release of the
    film. Searching and grabbing by hand work throughout, in both cases. Adds
    migration 00022.
  • Films import into their own library directory. Plex and Jellyfin want a
    Movies library separate from Shows, so Settings β†’ Library now takes a
    movies directory alongside the existing one, and a film places into it as
    Placeholder Film (2019)/Placeholder Film (2019).mkv, with the year left out
    of the name when the provider publishes none. Until that directory is set, a
    grabbed film waits in the Activity queue and says so
    rather than landing in
    the wrong library; setting one imports it on the next scan, and adding a film
    with no movies directory configured says so on the add form, so it is clear
    before the download finishes rather than after. A download that ships the
    feature alongside deleted scenes, an interview or a making-of imports the
    feature β€” the largest video in the payload. When two videos are the same size
    nothing is guessed: the import waits in the Activity queue for you to say
    which is the film.
  • Films read as films across the web UI. A film's page carries a status card
    β€” wanted, downloading or in the library β€” with the release year in its header,
    and its add form asks only whether to monitor it. The library list reports what
    a film is doing: Downloading, Downloaded, not imported, Import
    blocked
    , In library, Wanted, or Not monitored when nothing is
    pursuing it. The calendar shows a film's premiere as a premiere, and places far
    more of them β€” the release date AniList publishes now fills in where a
    broadcast schedule never existed, so a dated film leaves the No schedule
    data
    footer and lands on its day, while one announced with only a year stays
    in the footer rather than being placed on a date nobody published. A film's
    Releases tab lists everything the search returned, and its Search button on
    the Wanted page links straight there. Wanted says Not released yet and
    states the date plainly; the Activity queue, the import notifications, the
    delete confirmation and the release-match reasons all name the film. Series
    screens keep their wording throughout, single-episode OVAs and specials
    included.
  • Episodes can be filed without season folders. Settings β†’ Library now
    takes a Series layout: keep the default season folders, or choose flat and
    have episodes land in Placeholder Saga/Placeholder Saga - S01E05.mkv for the
    scanner configurations that prefer it. Films are unaffected, and so are
    single-episode OVAs and specials, which stay series-shaped as before.

Changed

  • A title's page has moved from #/series/:id to #/titles/:id, and the web
    UI calls it a title.
    The URL now matches what the rest of the product calls
    it. There is no redirect from the old address, so a saved link or a
    browser-history entry pointing at #/series/:id will not resolve β€” open the
    title from the Titles list instead. Every link inside the app already points at
    the new address. The sidebar and page title now read Titles to match, while
    genuinely episodic screens keep their wording.
  • A title page's link parameters now do one job each. ?tab=releases opens
    the Releases tab and ?item=N filters it to one episode, where a single
    ?item=N used to do both. A saved link or bookmark carrying only ?item=N
    now opens the title on its usual landing tab rather than on Releases; a
    series' Search button on the Wanted page sends both, so it is unaffected.
  • The REST resource is now titles, not series. An endpoint called
    series that returns films would be a wart the 1.0 stability promise freezes
    in place. Every /api/v1/series... route is now /api/v1/titles..., and the
    fields that name or reference one follow β€” in the webhook payload as well as
    the REST API, so the two agree. Discord and ntfy now announce Title added
    rather than "Series added". Nothing else changes β€” same behaviour, same data,
    same database, and your notification settings carry over untouched.
  • Adding a title now opens a form for it, carrying both add-time
    decisions.
    The monitor choice was a single control above the whole result
    list, and the quality profile was not asked for at all β€” an added series took
    the default and had to be re-assigned from its own page afterwards. Clicking
    Add on a result now opens a form for that title with Monitor and
    Quality profile on it, defaulted for the common case, so a seasonal show is
    still one confirmation and a long-runner is narrowed before its first search.
    The global "Monitor on add" control and the Add Β· future only button
    annotation are gone, and Discovery opens the same form.

Fixed

  • The quality-profile chip on a title's page no longer vanishes while it loads
    or when it fails.
    The picker rendered nothing until the profile list
    arrived, so the chips row shifted on every visit, and a failed fetch left no
    trace at all β€” just a missing control. It now holds its place while loading,
    shows a Profile unavailable chip you can click to try again, and links to
    Settings when there are no profiles to pick.
  • Profile names no longer collide only by case. Saving a profile named
    Anime while anime exists is refused with the same conflict a duplicate name
    has always given, matching how group names within a profile are compared.

Internal

  • Built with Go 1.26.6. The 1.26.5 standard library carries six
    vulnerabilities the release binary reaches β€” in net/http, crypto/tls,
    net/url, encoding/xml and encoding/asn1 β€” all fixed upstream.
  • Duplicate-name detection reads SQLite's result code instead of matching on
    the error message
    , so a driver that rewords its errors can no longer turn a
    conflict into a 500.
  • The profiles list reads groups and usage counts in bulk. GET /api/v1/profiles fetched both one profile at a time, so every profile cost a
    full scan of the series table. Groups and counts now come back in one query
    each, leaving the endpoint at three queries whatever the profile count.

Upgrade notes

  • Set a movies directory before a film can import. Settings β†’ Library
    takes one alongside the existing library directory (or
    TRANSPONDARR_LIBRARY_MOVIES_DIR); with it unset, films are still added,
    searched and grabbed, but a completed film waits in the Activity queue instead
    of being placed. Point it at a root your media server has as a Movies library,
    under the same mount your downloads use so the hardlink works. Nothing about
    episodes changes if you never set it.

  • Saved links into a title's page need re-making. #/series/:id has no
    redirect to #/titles/:id, and a bookmark carrying only ?item=N now opens
    the title on its landing tab rather than on Releases. Links inside the app are
    already updated; only your own bookmarks and browser history are affected.

  • The new series layout setting defaults to season folders, so nothing moves
    on upgrade.
    If you switch it later, it applies to future imports only:
    episodes already in your library stay where they are, and an upgrade of one of
    them lands in the new shape and leaves the old file behind, which the log
    warns about. API clients that write library settings must now send
    series_layout with the rest of the body: omitting it is refused rather than
    quietly resetting the layout to season folders. The web UI needs nothing.

  • API clients using X-Api-Key need one search-and-replace; the web UI needs
    nothing.
    The UI ships inside the binary and is already updated, so only
    machine clients notice. Every route under /api/v1/series moved to
    /api/v1/titles β€” including {id}, {id}/search, {id}/grab,
    {id}/grabs, {id}/blocklist, {id}/blocklist/{entryId},
    {id}/pinned-group and {id}/profile β€” and these JSON fields were renamed:

    Before After Where
    series_id title_id activity queue and history, calendar, wanted groups, discovery entries, pinned-group and profile-assign responses
    series_title title activity queue and history, calendar, wanted groups
    series (list) titles GET /api/v1/titles
    series (name) title title search, grab history, title blocklist
    series (count) titles GET /api/v1/blocklist
    series_ids title_ids POST /api/v1/wanted/search
    series_queued titles_queued POST /api/v1/wanted/search, PATCH /api/v1/wanted/items
    series_count title_count GET /api/v1/profiles
    on_series_added on_title_added notification settings
    series_title title webhook payload
    event: "series_added" event: "title_added" webhook payload

    Generated clients also see renamed operation ids (list-series β†’
    list-titles, and so on) and schema names (SeriesDTO β†’ TitleDTO,
    AddSeriesInputBody β†’ AddTitleInputBody, and so on); regenerate against the
    new spec. Nothing is dropped alongside the renames β€” the series database
    table keeps its name and its columns, and saved notification toggles are read
    under their existing keys, so nothing needs reconfiguring.

    Films add fields rather than changing any: titles carry format and year,
    the calendar, wanted and activity rows carry format so a client can word a
    film as one, library settings take movies_dir, and adding a title accepts
    quality_profile_id. All are optional on the way in, so a client that ignores
    them behaves as it did.

    One rename fails quietly rather than loudly, so check it if you script your
    settings: a PUT /api/v1/settings/notifications that still sends
    on_series_added turns that notification off, because the toggles are
    plain booleans with no unset encoding and a save replaces all of them. Every
    other rename here reports itself β€” an old route 404s, and series_ids is a
    required field, so POST /api/v1/wanted/search returns 422 rather than
    resetting your whole library's search backoff.