Integrations

Sync watched marks from Jellyfin.

Finish a movie or an episode in Jellyfin and biinge marks it watched. Mark it unplayed and biinge takes the mark away. Sync runs one way, from Jellyfin to biinge. It only touches titles that are already in your library. Setup takes a token from the app and one webhook destination on the Jellyfin server.

Before you start

  • Jellyfin 12 with the Webhook plugin from the Jellyfin plugin catalog
  • Admin rights on that Jellyfin server. Only an admin can add a webhook destination
  • Movies and episodes scraped by Jellyfin's built-in TMDB providers. That is where the ids come from. A library scraped only from local NFO files may lack them
  • A biinge server the Jellyfin server can reach over HTTPS
  1. 1

    Generate a token in the app

    Open Profile, then Integrations, then Jellyfin, and tap Generate token. The app shows the token once, with a copy button. Copy it now. It is not shown again.

    This is a Jellyfin token, not the app's access or refresh token. It can add and remove watched marks in your library, so treat it as a password. Generate a new one to replace it, or revoke it from the same screen.

  2. 2

    Add a webhook destination in Jellyfin

    In the Jellyfin dashboard open Plugins, then Webhook, and add a Generic Destination with these values.

    destination
    Webhook Name:       biinge
    Webhook Url:        http://localhost:8080/api/v1/webhooks/jellyfin
    Notification Type:  User Data Saved
    User Filter:        <your Jellyfin user>
    Item Type:          Movies, Episodes
    Send All Properties: on

    Set the User Filter to your own Jellyfin user. Every event that carries the token lands on the biinge account that owns it. Without the filter, plays by other people on the server would too.

  3. 3

    Add the request header

    In the same destination, add one Request Header. Paste the token from step 1 after Bearer, with a single space between them.

    header
    Key:    Authorization
    Value:  Bearer <the token from the app>

    The token is the only thing biinge checks. Anyone who has it can add and remove watched marks in your library until you revoke it.

  4. 4

    Watch something

    Save the destination, then finish a movie or an episode in Jellyfin. Marking it played from the Jellyfin UI works too, and marking it unplayed takes the mark away. The change shows up in biinge on the next refresh.

What a play does

Jellyfin never adds a title. Marking played adds a watched mark and marking unplayed takes it away. Nothing else in Jellyfin changes a mark, a library scan and a plugin import included.

You finishIn biinge
Finish or mark played a movie you want to watch or are watching Moves to watched
Finish or mark played an episode of a show you want to watch or are watching Marks the episode. The show becomes watching, or watched once every season is done
Mark played a movie or an episode you have already watched Nothing changes
Mark played an episode of a show you have already watched Nothing changes
Mark unplayed a watched movie Moves back to want to watch
Mark unplayed a watched episode Unmarks the episode. The show follows, the same as unmarking in the app
Mark unplayed a movie or an episode you have not watched Nothing changes
Anything on a title that is not in your library Nothing changes

When a mark does not show up

  • Check the Webhook plugin log on the Jellyfin server. It records every delivery and the status the API answered with
  • 401 means the token is missing, wrong or revoked. Generate a new one and update the header
  • 422 means biinge could not resolve the title. The movie has no TMDB id, the episode has no TVDB or IMDb id, or TMDB does not know that id. Refresh the item's metadata in Jellyfin
  • 502 means TMDB did not answer. The plugin does not retry, so mark the title in the app
  • 503 means biinge's database was unreachable. The plugin does not retry, so mark the title in the app
  • A movie or a show that is not in your library is ignored on purpose. Add it in the app first
  • Every accepted event is kept on the server with what biinge did about it. The API reference lists the fields the endpoint reads