Tags

Tags give the ability to mark specific points in history as being important
  • v1.4.0

    protected
    v1.4.0 — sync stops un-marking watched episodes
    
      - The Jellyfin/Emby episode write path could reset a FINISHED episode to
        unwatched with a resume position, because the Series/Episodes queries lack
        the isPlayed=false filter the movie path has. Sync is additive; it never
        un-marks.
      - Series folders stopped matching across servers: path_suffix's two-component
        rule is right for episode files but a series folder's parent IS the library
        root, which is what differs between servers. Every show whose libraries are
        named differently synced no episodes at all.
      - Watch state was merged into the local picture before the write was known to
        have succeeded, so a failed write made the next server pair skip those items
        as "already synced".
    
    First test coverage for functions.py series handling, jellyfin_emby.py writes
    and main.py ordering — the files carrying all three.
  • v1.3.0

    protected
    v1.3.0 — the deletion guard now measures what it was supposed to
    
    Two more paths where the engine concluded "never watched" from data it never
    had, both data loss:
    
      - The guard compared collected data against CONNECTED servers, not configured
        ones. generate_server_connections returns the survivors of a connection
        failure, so an unreachable Plex produced "1/1 returned data — complete" and
        everything watched only on Plex became deletable.
      - Partial failures inside a server (a dropped shared user, a library that
        would not open) hid watch history while the scan still counted as complete.
    
    Cleanup thresholds are also validated now. CLEANUP_DELETE_AFTER_DAYS=0 meant
    flag and delete in the same scan; MAX_AGE=0 flagged the entire library. Both
    were accepted from the settings API while SLEEP_DURATION beside them was
    bounds-checked.
  • v1.2.0

    protected
    v1.2.0 — a stuck deletion stops being invisible
    
    An item that cannot be resolved to a single Radarr/Sonarr entry is refused,
    correctly, but was then refused again every hour forever with no counter, no
    alert and no dashboard surface. One movie sat eight days past its deletion date
    looking perfectly healthy.
    
    Failures are now counted per item with their reason, and escalate after three
    consecutive misses. The audit trail is written per deletion rather than batched,
    so a crash mid-batch can no longer leave media deleted with no record of it.
  • v1.1.0

    protected
    v1.1.0 — the cleanup engine stops deleting media people have watched
    
    Six independent paths could answer "nobody watched this" when somebody had, and
    each ended in an irreversible file delete.
    
      - Cross-server identity: the merge keyed on the raw title string, so Plex's
        "Star Wars: The Mandalorian and Grogu" and Jellyfin's "The Mandalorian and
        Grogu" were two records — one holding every watch, one holding none. Now
        matched on tmdb/imdb/tvdb ids, which Jellyfin was already fetching and
        discarding.
      - Watched-with-no-play-date counted as never watched.
      - A missing Overseerr request date skipped the grace period entirely.
      - A lone *arr title match was accepted without comparing years, so the wrong
        film could be deleted.
      - "Requested & Unwatched Shows" could never fire ("tv" vs "show").
      - Exclusions checked only one server's spelling, a config seed silently
        destroyed user-added protections, and legacy wildcards were dead rules.
    
    CLEANUP_EXCLUDE_CONTINUING was also a no-op for Plex shows: plexapi reports no
    status, so the engine now treats it as unknown and declines to delete a series
    it cannot confirm has ended.
  • v0.1.0

    protected
    v0.1.0 — first release on GitLab CI/CD (lint+lockfile+audit+build+scan+deploy)