Skip to content

Wip - #1803

Open
Breezyslasher wants to merge 4 commits into
CastagnaIT:wipfrom
Breezyslasher:wip
Open

Wip#1803
Breezyslasher wants to merge 4 commits into
CastagnaIT:wipfrom
Breezyslasher:wip

Conversation

@Breezyslasher

@Breezyslasher Breezyslasher commented Aug 27, 2026

Copy link
Copy Markdown

Check if this PR fulfills these requirements:

Types of changes

  • New feature (non-breaking change which adds functionality)
  • Feature change (non-breaking change which changes behaviour of an existing functionality)
  • Improvement (non-breaking change which improves functionality)
  • Bug fix (non-breaking change which fixes an issue)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Refactor (non-breaking performance or readability improvements)

Description

Repair plugin.video.netflix against the current Netflix website

Netflix reshaped its member API over 2026: Falcor paths that the add-on has
asked for years now answer 404, several features moved to persisted GraphQL
queries on a different host, and the sign-in flow gained an identity check that
the add-on had no way to answer. The add-on was effectively unusable — it could
not sign in, and once signed in most menus were empty.

This branch follows the current website call by call. Every change was derived
from a HAR capture of the real site and verified against a Kodi debug log from
the device, not from guesswork.

68 commits, 1.23.6+matrix.201.23.6+matrix.94, 40 files changed
(+2246 / −237)
on top of the imported upstream add-on.


Sign-in and identity verification

Was Sign-in failed outright.
Now E-mail/password sign-in works, and the identity check Netflix inserts is answered the way the browser answers it.
  • Rebuilt e-mail/password sign-in for the current CLCS login flow.
  • Added the "confirm your identity" flow: the add-on reports the check screen,
    chooses the e-mail code option, prompts for the code (saying how many
    digits it expects), and closes the screen in the same order the website does.
  • The check runs on whichever page the redirect actually landed on, rather than
    a hardcoded URL.
  • A closed code prompt is treated as a cancellation instead of an error.
  • Browser identity (headers, TLS settings) is kept consistent for the whole
    session, so the settings pages and the check screens are not served different
    content than the login was.
  • Sign-in without keeping a password. An account verified by e-mail code no
    longer needs a stored password at all; where a password was previously
    mandatory the add-on now tries the session cookies first and only falls back
    to the password if the cookies are refused.

Profiles, PIN and parental controls

  • Profile lists are read with the website's query when the previous path fails.
  • The profile PIN is verified through the member API (the old verification
    endpoint is gone), and the result is reported to the user.
  • The profile lock is back in a profile's context menu, including its own
    identity-check flow — the add-on asks Netflix whether the lock needs identity
    confirmation instead of assuming.
  • Offer to change the PIN of a profile that is already locked, which
    previously had no route.
  • Restored the parental-control settings screen, and the maturity level is now
    read and saved with the routing header the save requires.
  • Stopped verifying a password that the current API cannot verify.

Menus and browsing

  • Genre categories, sorted lists, and the season/episode selectors all use the
    request shapes the website uses.
  • Every row of a genre page is shown, and a row without a context no longer
    aborts the listing — handled everywhere such a row is read.
  • Added the Netflix home rows menu, which mirrors the site's own home page.
  • Gave the Audio description menu back, built from the website's collections.
  • Restored the Recommendations menu and its settings toggle.
  • Main menu labels. With the LoCo root gone the menu falls back to built-in
    labels, and four of those were wrong: currentTitles was labelled
    "Alphabetical order (A-Z)", mostViewed was labelled "Recommendations"
    (colliding with the real Recommendations menu, so two identical folders
    appeared and one served popular titles), and newRelease and
    netflixOriginals had no label at all — which silently dropped them from the
    menu entirely. Each now carries the label its own settings toggle already
    advertised.
  • LoCo root lookup: ask the root for its id and address it like every other row,
    fall back to the browse page, then to the previous path; log the status the
    bare root returns, and stop spending requests probing page identifiers that
    were never roots.

Titles, metadata and artwork

  • Similar/suggested titles are read from the query the website uses next to a
    video.
  • Whether a title can be played is read from wherever the summary happens to
    keep it — the field moved and the old location returns nothing for some titles.
  • A list is asked for once and yields every item it holds, instead of one
    request per page.
  • Row references on a genre page are resolved out of the list itself.
  • Stopped requesting the cast of every item in a genre grid — a large, slow
    field nothing in the grid displays.

My List, reminders and ratings

  • Add/remove for My List, reminders, and Continue Watching use the website's
    current mutations.
  • My List no longer times out.
  • Thumb ratings are sent the way the website sends them, the current rating is
    read without the retired path, and the "love" rating the website has was
    added (with the rating dialog updated to match).
  • The user is told what actually happens when a title is rated.

Search

  • Search operations updated to the current ones.
  • Videos can be searched by dubbing language.

Resilience and speed

  • When a request is refused, the add-on falls back to the previous call shape
    rather than failing the whole listing.
  • Field lists the server refuses (404/412) are remembered, so the same
    doomed request is not paid for again in the same session — this also stopped
    refusals from making the session look expired.
  • Account requests are sent to the gateway that actually serves them, with the
    context and browser identity the website sends.
  • The browse page is cached briefly so a fallback does not fetch it twice inside
    one listing.

Verification

Every change in this branch was exercised on a real device (Kodi on Linux,
Widevine L3) and confirmed from the debug log. As of matrix.94:

  • Sign-in, profile switch, PIN and profile lock: working.
  • Home, Recommendations, genres, My List, search: populated.
  • Playback: Chunked request will be executed with auth data: {'auth_scheme': 'NETFLIXID'},
    manifest 242 ms, license 113 ms, License update successful, playback start
    event accepted.

Known limitations

  • The LoCo root is gone. The bare loco path answers 404 and the browse
    page no longer carries a root id anywhere, so the main menu uses built-in
    labels. Everything works; the menu entries just don't take their names from
    Netflix's own row titles.
  • Two Falcor paths are still refused and fall back cleanly: the video-event
    metadata path (404) and the genre metadata field list (412, retried with
    a lighter field set).
  • 4K needs HEVC and Widevine L1; on an L3 device 1080p is the ceiling.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant