YouStream

YouStream

Movies and episodes that are on YouTube, playable from Stremio and Nuvio, matched by runtime so you get the film or the episode, never its trailer. Plus YouTube itself: search it, and keep searches, channels, playlists and Trending as catalogs.

YouTube API key

YouStream searches YouTube with your own key, which is free. A key can search 100 times a day. A search is spent the first time a title is looked up, and nothing is spent after that for a day, however often it is opened again.

How to get one:
  1. Open the YouTube Data API v3 page in Google Cloud, pick or create a project, and press Enable.
  2. Go to Credentials, then Create credentials → API key.
  3. Leave Application restrictions at None: this server makes the calls, not your browser. Limiting the key to the YouTube Data API v3 is fine.
Your key is kept only inside your personal addon link; YouStream never stores it (see the privacy policy).

TMDB key optional

Lets YouStream read the tmdb: ids Nuvio uses for some titles, and adds TMDB's cast lists and other names to the evidence a match needs.

This server already has a TMDB key that everyone shares, so you can leave this blank. Add your own only if you prefer to. Get one free under TMDB settings → API; either the API key or the Read Access Token works.

Look for

Each type you switch off saves your daily searches for the rest. Switch both off to use YouStream for YouTube alone.

YouTube in your app

Search YouTube from your app, and keep searches, channels, playlists and Trending as rows on its home screen. A video you open there plays the ways you choose under “When you press play”, and one you save to your library is listed under the type YouTube.

Catalogs

Each one is a row on your app's home screen, in this order: use the arrows to arrange them. Choose where a row's videos come from, type the search or paste the playlist or channel, then choose how its videos are ordered.

Trending in your country
Refresh catalogs every
A search catalog costs one of your 100 daily searches each time it refreshes; a channel, a playlist or a Trending row costs almost nothing. A row refreshes only when your app shows it after this long: every 2 hours unless you change it, and at most every 30 minutes. YouTube's terms let a server keep its data 30 days at most, so anything longer refreshes then. SafeSearch applies to searches.

Runtime matching

A video only counts when its length is close to the listed runtime. This is what keeps trailers and clips out. A margin can be in seconds, minutes, or a percentage of the runtime. For example, a 23-minute episode with a 25-second margin accepts anything from 22m 35s to 23m 25s. The defaults come from measuring real uploads against their listings; the episode number, not the length, is what keeps the wrong episode out.

MoviesAround the film's runtime.
Movies, official channelsStudios' own uploads are often cut differently: Indian films run 10 to 25 minutes short.
EpisodesAround the episode's own runtime, when it is listed.
Episodes, usual length onlyWhen only the show's usual episode length is known. Episodes vary, so this one is wider.

When you press play

Each video found is offered these ways, in this order. The first one is what the play button lands on.

Results

Your country hides videos that are blocked there and ranks results for it, YouTube search and Trending included. An audio language drops videos in another one — going by what the title says (“Hindi dub”) before YouTube's own tag, which channels often get wrong — adds it to movie searches (good for dubbed films), and ranks it first. Videos with no language known are kept. The view minimum keeps out nearly unwatched lookalikes; 0 turns it off.
Advanced
Stream name and description

How each stream reads in your app. Templates use AIOStreams' formatter syntax, which PenguPlay uses too, so one made for either works here: {video.channel::upper}, {video.official::istrue["โœ“"||""]}, and {? โ€ฆ ?} for a part shown only when its fields have values. The syntax

Preview
      Fields
      {play.icon}โ–ถ๏ธ in the app, ๐Ÿ“ฑ YouTube app, ๐Ÿ“บ SmartTube
      {play.label}Play in app, YouTube app or SmartTube
      {video.title}The video's title on YouTube
      {video.channel}The channel that uploaded it
      {video.official}true for an upload by a YouTube content partner
      {video.definition}HD or SD
      {video.views}338K
      {video.uploaded}The upload date, 2023-10-16; ::date('%-d %b %Y') gives 16 Oct 2023
      {video.length}1h 35m 09s
      {video.offset}How far from the listed runtime: โˆ’51s, +2m 10s or exact
      {video.language}The language it is spoken in
      {video.ageRestricted}true for a video YouTube restricts by age
      {video.live}true while a video is streaming live, which has no length yet
      {video.id, video.url}The video's id and link
      {stream.filename}The release-style name AIOStreams parses: title, year, episode, HD, WEB-DL, language
      {stream.resolution}720p for HD, 480p for SD: what AIOStreams reads
      {stream.quality}WEB-DL
      {stream.duration}The length in milliseconds; ::time('[%-Hh ]%-Mm %Ss') gives 1h 35m 09s
      {stream.languages}The language as a list, also as languageEmojis, languageCodes and smallLanguageCodes
      {stream.seasonEpisode}S01 and E03 for an episode; ::join('') gives S01E03
      {stream.type}youtube for in-app rows, external for the others
      {stream.age}How long ago it was uploaded: 365d
      {stream.message}A note, such as that a video is age-restricted
      {metadata.title, metadata.year}The film or show the stream was found for; empty for a YouTube video opened from a catalog or search
      {metadata.episodeTitle}The episode's own title
      {addon.name}YouStream

      Every field AIOStreams documents works too; those YouTube has nothing for, such as sizes and seeders, are empty. AIOStreams itself reads each stream's resolution, quality, year, episode and language from the release name, so its filters and sorting work the same whatever these templates say.

      Placeholders: {title} {year} {season} {episode} {s00e00} {episodeTitle} {absolute} {language}. {title} is required. Every search costs one of your 100 a day, so there is one per title.
      A word that is part of the title's own name is ignored for that title, so “trailer” never hides Trailer Park Boys.
      How fan films, explainers, video essays and unofficial copies describe themselves: “fan movie”, “in this video”, “video essay”, “fair use”.

      Install in Stremio
      In Nuvio, or if the button does not open Stremio, paste the copied URL into the app's add-addon box. Keep it private: it contains your keys.