RP
Arise RPM player labJSON + player viewer
AES-128-CBCProject repo
Glass player workspace

Play the stream, switch quality outside the player, and inspect the JSON only.

The page is simplified to the two things that matter here: the working player and the cleaned JSON response. Null keys are omitted from the viewer to keep the payload easier to scan.

Request`GET /api/[code]`
Ready
/api/Ctrl K
Player

External quality selector + storyboard hover previews

Vidstack still handles audio and captions inside the settings menu. The quality row below is a separate controller.
Player will render hereLoad a code to attach the proxied master playlist to the player.
Separate quality selector

`Auto` uses Vidstack's adaptive selection. Fixed buttons call the player remote with the exact quality index after the quality list is loaded.

0audio tracks in settings
0subtitle files mounted as `Track`
nonethumbnails prop powers hover previews
Exact player logic

How this player is wired

  1. The page calls /api/zbsewt and receives the decrypted RPM response.
  2. `masterPlaylistProxy` becomes the HLS player source so every playlist and segment stays proxied.
  3. Each subtitle VTT is mounted with `<Track />`, so captions appear in the default Vidstack menu.
  4. `DefaultVideoLayout` receives `spritesheet.vttProxy`, which is why seek hover previews can use the storyboard VTT and image.
  5. The external quality selector calls `player.remoteControl.changeQuality(index)` or `requestAutoQuality()` for adaptive mode.
<MediaPlayer src={{ src: data.masterPlaylistProxy, type: "application/x-mpegurl" }} poster={data.posterProxy}>
  <MediaProvider>
    {data.subtitles.map((track) => (
      <Track src={track.proxiedUrl} kind="subtitles" label={track.name} lang={track.language} />
    ))}
  </MediaProvider>
  <DefaultVideoLayout thumbnails={data.spritesheet.vttProxy} icons={defaultLayoutIcons} />
</MediaPlayer>
JSON output

Color-coded API response

{
"info": "Load a code to display the RPM scraper response."
}