Kyoo/scanner

Scanner

Workflow (for v5, not current)

In order of action:

  • Scanner gets /videos & scan file system to list all new videos
  • Scanner guesses as much as possible from filename/path ALONE (no external database query).
    • Format should be:

      {
          path: string,
          version: number,
          part: number | null,
          rendering: sha(path except version & part),
          guess: {
              from: "guessit"
              kind: movie | episode | extra
              title: string,
              year?: number[],
              season?: number[],
              episode?: number[],
              ...
           },
      }
      
      • Apply remaps from lists (AnimeList + thexem). Format is now:
      {
          path: string,
          version: number,
          part: number | null,
          rendering: sha(path except version & part),
          guess: {
              from: "anilist",
              kind: movie | episode | extra
              name: string,
              year: number | null,
              season?: number[],
              episode?: number[],
              absolute?: number[],
              externalId: Record<string, {showId, season, number}[]>,
              history: {
                  from: "guessit"
                  kind: movie | episode | extra
                  title: string,
                  year?: number,
                  season?: number[],
                  episode?: number[],
                  ...
               },
              ...
           },
      }
      
  • If kind is episode, try to find the serie's id on kyoo (using the previously fetched data from /videos):
    • if another video in the list of already registered videos has the same kind, name & year, assume it's the same
    • if a match is found, add to the video's json:
    {
        entries: (uuid | slug | {
            show: uuid | slug,
            season: number,
            episode: number,
            externalId?: Record<string, {showId, season, number}> // takes priority over season/episode for matching if we have one
        })[],
    }
    
  • Scanner pushes everything to the api in a single post /videos call
  • Api registers every video in the database
  • For each video without an associated entry, the guess data + the video's id is sent to the Matcher via a queue.
  • Matcher retrieves metadata from the movie/serie + ALL episodes/seasons (from an external provider)
  • Matcher pushes every metadata to the api (if there are 1000 episodes but only 1 video, still push the 1000 episodes)