Skip to content

Repository files navigation

Xbox Ownership Filter

A Playnite extension that separates Xbox games you actually own from games you only played through Game Pass.

Playnite's Xbox library integration imports your play history, which mixes purchases together with Game Pass titles you no longer have access to. This plugin works out which is which and lets you decide what happens to each group.

Beta. Every action defaults to doing nothing. Run detection, read the report, and only then choose what you want changed.

What it does

Detection signs you in to your Microsoft account and reads your Store entitlements. Anything in your Xbox library with no matching entitlement was Game Pass access.

Entitlements are broader than purchases, so each one is classified:

Verdict Meaning Counted by default
Bought The SKU you hold can be purchased Yes
In a bundle Granted by something you bought, in the same transaction Yes
Free to play Every purchasable SKU lists at zero Yes
No longer sold No SKU can be bought any more, so ownership is assumed Yes
You own add-ons You hold DLC or another edition of the title No
Gold or promo A SKU that cannot be bought, with no matching purchase No
Demo or trial Flagged as a demo, or a Trial SKU No

You choose which categories count before each run. Games are then sorted into three groups, each with its own action: owned with a PC build, owned console only, and Game Pass.

Actions available per group: do nothing, tag only, hide, hide and tag, or (behind Advanced) delete and exclude from reimport.

Getting started

  1. Install the .pext file, or extract the release into %AppData%\Playnite\Extensions\XboxOwnershipFilter
  2. Restart Playnite
  3. Extensions → Xbox Ownership Filter: detect owned games
  4. Pick what counts as owned, sign in, and wait. The first run is slower because it looks up library entries that need edition matching.
  5. Read the summary, then open the manager to review before applying anything

Nothing in your library changes until you choose an action and press Save and apply.

Your decisions always win

Detection is a starting point, not an authority.

  • Ticking a game marks it owned permanently, whatever detection thinks
  • Unticking a detected game records "I do not own this" and that survives future runs
  • The Source column shows whether a verdict came from you, from detection, or both

Reports

Three files, all in the plugin's data folder and all openable from the manager window:

  • detection.csv — every entitlement, with the SKU, price, and reason behind each verdict
  • unmatched.csv — every library entry detection could not account for, and what it tried
  • audit.csv — every change this plugin has made to your library, appended over time

If something is classified wrongly, those first two files are what to attach to an issue.

Known limitations

Cloud streaming is not a category. Nothing in the Xbox or Store APIs exposes Cloud Gaming eligibility. Console-only titles are labelled as such because they cannot be installed on a PC, not because they cannot be played.

Delisted purchases resolve to owned. When no SKU of a product can be bought any more, a withdrawn purchase and an old giveaway look identical. Old purchases are far more common, so those count as owned. A Games with Gold title that has since been pulled from the Store will be counted incorrectly.

Add-on ownership is suggestive, not conclusive. People buy DLC for games they access through Game Pass, so the "owned add-ons" rule is off by default. Turning it on catches fragmented editions at the cost of marking those Game Pass titles owned.

Editions fragment. A game's PC and console builds can be separate products with separate ids. Most are reconciled by matching on title id or add-on parentage, but some will need a manual tick.

One region at a time. Store lookups use a single market, set under Advanced and defaulting to US. Pricing and availability are regional, so the wrong setting can misreport free-to-play titles.

Console entries need the Xbox plugin's console import enabled. Without it, console-only purchases never appear in Playnite and the owned-console group stays empty.

Sign-in and privacy

Sign-in happens in Playnite's embedded browser, on Microsoft's real sign-in page. The plugin never renders a credential form and never sees your password.

The access token lives in memory for the session and is never written to disk. There is no refresh token, so signing in again is a browser redirect that is usually silent because the webview keeps its cookies.

Nothing is sent anywhere except Microsoft's own Store endpoints. There is no telemetry.

Building

Requires Visual Studio 2022 and .NET Framework 4.6.2. Open the solution and build. Close Playnite first, since it locks the output assembly.

See BUILD.md for details.

License

MIT. See LICENSE.

Reporting problems

Please include:

  • What you expected and what happened
  • detection.csv and unmatched.csv
  • The name of a specific game that was classified wrongly

A single misclassified game with its report rows is far more useful than a description of the overall result.

These reports describe your account's game entitlements and play history. They contain no credentials, but they are personal data: skim them before attaching and redact anything you would rather not share.

Testing without an account

The manager's Advanced section can run the classification engine against a CSV of manufactured entitlements: no sign-in, no network, nothing changes. See docs/SIMULATION.md. This is also the fastest way to help diagnose a bug: rows that reproduce a wrong verdict are a complete, shareable test case.

About

Playnite extension that separates Xbox games you own from ones you only played on Game Pass.

Topics

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages