Skip to content

Show catalogs from any addon type and fix addon-based collections (TV + web) - #799

Merged
ProdigyV21 merged 2 commits into
ProdigyV21:mainfrom
silentbil:fix/addon-catalogs-and-collections
Oct 9, 2026
Merged

ProdigyV21 merged 2 commits into
ProdigyV21:mainfrom
silentbil:fix/addon-catalogs-and-collections

Conversation

@silentbil

@silentbil silentbil commented Oct 9, 2026 •

Copy link
Copy Markdown
Collaborator

Why

Users reported that ARVIO hides catalogs that other Stremio clients show (AIOMetadata personal/anime/"all" lists, custom display types, debrid libraries). Catalogs were dropped unless their type was movie/series/tv/show, and Nuvio-style collections built on such addons loaded empty.

What changed (TV + web)

  • Any catalog type is kept, using the addon's own spelling (addons route by it).
  • Collections: addon matched by manifest id, the named addon is asked for catalogs its manifest doesn't list, manifest type spelling + %20 encoding, addon-defined types load in both tabs.
  • Native items: keep the addon's own type for /meta and /stream; live channels (tv) play directly and stay out of Continue Watching; items a metadata addon re-lists are served by the installed addon that owns their ids.
  • Robustness: one bad genres value no longer fails a whole catalog; no /meta calls an addon can't answer; back-off on 429; installed addons read once per page (fixes an ANR on large catalogs).
  • Home: addon rows named after streaming services are no longer hidden.
  • Web: audio-only sources (podcasts) are not failed by the video-frame watchdog.

Testing

  • Unit tests: TV 2277 passing, web 954 passing (new tests for ownership, lenient genres, type spelling/encoding, live channels, audio sources).
  • Manually on an Android TV emulator and in Chrome: addon catalogs with custom types appear, a Nuvio collections export imports and its folders load, series/podcast episodes and a live channel play.

…don sources

Addon catalogs were dropped unless their type was movie/series/tv/show, which
hid AIOMetadata anime/"all"/custom display types, podcasts and debrid libraries.
Any type is now kept, with the addon's own spelling, on TV and web.

- Catalogs: tolerate a bare-string `genres` (one item no longer fails the whole
  catalog); only fall back to alias types the addon declares for that catalog.
- Collections: match the addon by its manifest id, ask the named addon for
  catalogs its manifest doesn't list, send the manifest's type spelling,
  percent-encode spaces, and keep addon-defined types in both folder tabs.
- Native items: keep the addon's own type for /meta and /stream; a live channel
  ("tv") opens and plays directly and is kept out of Continue Watching; items a
  metadata addon re-lists belong to the installed addon that serves their meta.
- Requests: no /meta calls an addon's manifest can't answer, back off on 429,
  and read installed addons once per catalog page (per-item reads caused an ANR).
- Home: show addon rows named after streaming services like any other row.
- Web: same catalog/collection/native-item changes; audio-only sources are not
  failed by the video-frame watchdog.
@github-actions github-actions Bot added area: android Changes to the Android app or Gradle build area: web Changes to web or Netlify sites labels Oct 9, 2026
@silentbil
silentbil requested a review from ProdigyV21 October 9, 2026 11:35
@ProdigyV21

Copy link
Copy Markdown
Owner

Thanks for this contribution! Supporting more add-on catalogs and collections on TV and web is a useful improvement, especially the work to avoid repeated manifest parsing on large catalogs.

I found three Android gaps to fix before merging:

  1. Please carry the original add-on type through stream selection and URL construction. Live tv items currently open as movies, so source lookup can exclude their add-on or request /stream/movie/ instead of /stream/tv/. Strict custom types such as Podcasts can also be filtered out before the new episode resolver runs.
  2. Please preserve the custom add-on type in portable watch history, or resolve it correctly on restore. A fresh device currently restores a Podcasts item as series, which can leave its details/episodes unavailable. I reproduced this with a temporary regression test using an empty registry; the existing test restores into the same registry and misses this case.
  3. Please use consistent path-segment encoding for catalog, metadata, and stream URLs. Catalog URLs now correctly use %20, but getAddonMeta() still encodes spaces as +, so a type such as Live Docs can load its catalog but fail to load details.

The 111 focused web tests and 19 existing targeted Android tests passed; the additional fresh-device regression test failed as described above. Please add coverage for that restore case and strict tv/custom-type source lookup. Once these are addressed, this should be a much more reliable addition. Thanks again!

Review follow-up:
- Pass a native item's own add-on type (e.g. "tv", "Podcasts") through stream
  selection and /stream URL construction, so add-ons that declare only that type
  are not filtered out and live channels request /stream/tv/ instead of /movie/.
- Keep the type in portable watch history (addonNativeType) and use it on
  restore; entries saved without it resolve the type from the owning add-on's
  manifest and remember it.
- Encode catalog, meta and stream path segments with one helper (%20 for spaces).
- Tests: fresh-device restore with an empty registry (with and without a stored
  type), strict tv/custom-type stream lookup, and meta URL encoding.
@silentbil

Copy link
Copy Markdown
Collaborator Author

Thanks for the thorough review — all three points were valid. Fixed in 9b7cfad:

  1. Original add-on type through stream selection and URLs. A native item's own type (e.g. tv, Podcasts) is now passed from Details/Player through every stream path (progressive, non-progressive and single-add-on retries). It drives both add-on selection and the /stream/<type>/ URL, so live channels request /stream/tv/<id> and add-ons that declare only a custom type are no longer filtered out before the episode resolver runs.
  2. Portable watch history. The type is now stored with the Continue Watching entry (addonNativeType, synced with the rest of the item) and used on restore when the registry is empty. Entries saved before this change resolve the type from the owning add-on's manifest when the stored one gets no answer, and the result is remembered.
  3. Consistent path-segment encoding. Catalog, meta and stream URLs now share one helper (%20 for spaces), so a type like Live Docs loads both its catalog and its details.

Coverage added: fresh-device restore with an empty registry (with and without a stored type), strict tv and Podcasts source lookup asserting the exact stream URLs, and a meta URL with a space in the type. Full unit suite: 2282 passing. Also verified on an Android TV emulator: a live channel and a podcast episode request their own types and play, and the type is persisted in watch history.

@ProdigyV21
ProdigyV21 merged commit 55f4ae2 into ProdigyV21:main Oct 9, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: android Changes to the Android app or Gradle build area: web Changes to web or Netlify sites

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants