# 308 Media — Roku sideload (308 Embroidery)

**One channel** that replaces the separate **Local Media** and **Old Time Radio** sideloads.

Roku only allows **ONE** developer sideloaded channel at a time. Installing this zip **replaces** whatever was previously sideloaded (Local Media *or* Old Time Radio). Use **308 Media** for both live radio and the OTR library.

**Package:** `308Media.zip` (this folder) · **v1.4 build 26** (md5 ec47ff434d5e6007355b9e3d281dd4a8; also `308Media-b26.zip`). Previous: `308Media-b25.zip` (b253106f…, rollback), `308Media-b24.zip` (b039e129…), `308Media-b23.zip` (487634d9…), `308Media-b22.zip` (185f4626…), `308Media-b21.zip` (7007b822…), `308Media-b20.zip` (0b426be7…), `308Media-b19.zip` (2c4a094b…), `308Media-b18.zip` (555bca78…), `308Media-b17.zip` (6809dee7…), `308Media-b16.zip` (20a2c166…), `308Media-b15.zip` (b8d42ae1…), `308Media-b14.zip` (308f16fd…), fallback `308Media-b12.zip` (0fe21387…).

> **v1.4 build 26:** Exercise is only on its own Home tile now. It is no longer a genre inside Vintage TV and isn't counted there (home.json `sections.tv.hideGenres`). The Exercise tile and Continue still open all 6 groups. Everything else is unchanged from build 25.

> **v1.4 build 25:** new **Vintage Media** hub tile right after Continue. Vintage TV, Vintage Movies, Vintage Cartoons, Old Time Radio, 308 Radio Station and the in-season Holiday row are inside it (OK opens, Back returns Home). Home: (Continue) · Vintage Media · Live Radio Stations · Exercise · Weather & Local · Games · Profile. Section/radio headers follow the shared names; Exercise and Wolfman Jack episodes show a short description. Hubs come from `hubs` in home.json (builds 24 and older ignore it and show the tiles flat). Everything else is unchanged from build 24.

> **v1.4 build 24:** new **Weather & Local** tile on Home (before Games) for Scottsbluff / Gering, NE 69361, straight from the National Weather Service: current conditions (Scottsbluff airport), local time + sunrise / sunset, next 12 hours, 7-day forecast, detailed forecast text, active alerts for Scotts Bluff County, and a radar loop (Cheyenne KCYS, North Platte KLNX, Northern Rockies, US). Left / Right = Now · Radar · Forecast · Alerts; Up / Down = change radar / scroll / next alert; OK = refresh (Radar: pause / play the loop); Back = Home (radio keeps playing). Refreshes every 10 minutes while open. Everything from build 23 is unchanged. To go back: install `308Media-b23.zip`.

> **v1.4 build 23:** new **Games** tile on Home (next to Profile) opens a Games list with **Donut Dash** (Chris eats donuts while the evil cookies chase him). Arrows move, OK starts / pauses, Back leaves the game and returns to the Games list; Back again goes Home. Starting a game stops any radio/video that is playing. High score is saved on the Roku. Everything from build 22 is unchanged. To go back: install `308Media-b22.zip`.

> **v1.4 build 15:** scroll indicators on every scrolling menu: a gold up/down chevron when there are more choices above/below, a thin scroll bar, a "5 of 40" counter under the list, and a soft fade at the edge that has more. Everything from build 14 is unchanged.

> **v1.4 build 14:** fixes the build 13 freeze on the main menu. Build 13 did per-episode work on the UI (render) thread every time the home screen rebuilt: the Continue tile scanned and md5-hashed all ~16,000 episode URLs, and the 2.4 MB OTR catalog was copied between threads. Build 14 reads and parses every catalog in a background task, precomputes the progress keys there, loads a small OTR show index (index.json) plus each show's episodes only when you open it (eps/<id>.json), and gives the station its own small sample (station-pool.json). Year/season menus are built only when a show is opened. **Audio Theater removed** (the audio files stay on the shop PC). Saved progress carries over.

> **v1.4 build 13:** long shows get a **year / season menu** (shows over 60 episodes, grouped by season if known, else by air year) and any group over 40 episodes is split into **Parts** (e.g. "1953 · Part 2"); shows with no dates get "Episodes 1–38" chunks. Back goes episodes → groups → shows. Autoplay and Continue roll into the next group. Old Time Radio now loads the live catalog first (96 shows / ~13,000 episodes) with the bundled copy as fallback; catalog timeout 30 s. Saved progress from b12 carries over (same registry).

> **v1.4 build 7:** home tiles, Live Radio stations and the 308 Radio Station lineup are read from /apps/media/shared/{home,radio,station}.json at launch (the same files the web player at /apps/media/player/ reads), with a bundled fallback. See SYNC.md.

> **v1.4 build 6:** retro gold 308 MEDIA logo on home (images/logo_308media.png), yellow subtitle line removed and tiles moved up, new channel icon + splash. Video playback as in build 5.

> **v1.4 build 12:** video fix: TV/movies stuck at "buffering 100%" (position 0, duration 0). The hidden audio player is a Video node; after it has played radio/OTR/station audio it can keep the single video decoder. b12 replaces it with a fresh node before every video and, if a video still sits at buffering 100% for 10 s, rebuilds the nodes and restarts once.

> **v1.4 build 5:** video fix: every video plays in a brand-new Video node with minimal content (what worked in the b4 bare-node test); audio uses its own hidden player again; Video test tile removed from home.

> **v1.4 build 4:** clean 4-across tile home (genre-first screens behind each tile, Continue tile when something is part-played) and a temporary **Video test** tile with playback diagnostics (A1–F).

> **v1.4 build 3:** Netflix-style home rows (Continue · On the Air · Live Radio · Featured Shows · Old Time Radio · Vintage TV · Movies · Cartoons · Audio Theater) with poster art from `/apps/roku-video/art/` and a hero preview; Back returns to the same spot on home. **Video fix:** one player node for audio and video (a second hidden player was holding the single video decoder, leaving video stuck at buffering 100%); 308 Radio Station now-playing screen fixed.

> **v1.4 build 2:** video playback fix: TV, Movies and Audio Theater video use a dedicated full-screen player with Roku's native controls, a loading card, and an on-screen error panel after 20 seconds (state, error code, message, URL).
>
> **v1.4 build 1:** new **308 Radio Station** (nonstop OTR on a Mountain Time lineup; Up = next show, Down = previous), **autoplay next episode** with a 10-second “Up next” card (OK = play now, Back = cancel), **sleep timer** (press * while playing: Off/15/30/60/90), and seasonal **Halloween** (Oct 1–31) / **Christmas** (Nov 15–Jan 6) sections from `/apps/roku-video/holiday.json`. To preview the holiday sections off-season, press * on the main menu. See the install page (index.html) for the full notes. The older sections below describe the original v1.0 layout.

---

## What’s inside

| Section (Main Menu) | Content |
|---------------------|---------|
| **Live Radio** | 10 AAC stations (Rural Radio + faith/local) — same streams as Local Media (`es.aac-adts`) |
| **Old Time Radio** | 17 shows · 333 public-domain episodes from Archive.org (`mp3`) — same catalog as Old Time Radio |
| **TV & Info** | Info-only notes (portal / antenna) — not in-app livestreams |
| **About** | Credits and sideload note |

Home opens to a **Main Menu**. OK opens a section; **Back** returns to the menu (or stops playback first).

---

## 1. Enable Developer Mode on the Roku (one-time)

1. On the Roku remote, press: **Home** three times → **Up** twice → **Right** once → **Left** once → **Right** once → **Left** once → **Right** once  
   (classic secret code), **or** go to **Settings → System → Advanced system settings → Developer** (wording varies by OS).
2. Accept the Developer Agreement.
3. Set a **developer password** (remember it).
4. Note the **Roku IP address** shown on that screen (example: `192.168.1.50`).
5. Leave the Roku on and connected to the same network as your PC/phone (or reachable via Tailscale).

---

## 2. Install the channel zip

### Option A — Browser upload

1. On a PC or phone on the same network, open: `http://ROKU_IP`  
   (replace `ROKU_IP` with the address from step 1).
2. Enter the developer password when prompted.
3. Under **Install utility**, choose **Upload** / browse to `308Media.zip`.
4. Click **Install**. Wait for “Application Received: Replace” / success.

### Option B — curl

```bash
curl -F "mysubmit=Install" -F "archive=@308Media.zip" -F "passwd=YOUR_DEV_PASSWORD" http://ROKU_IP/plugin_install
```

Replace `YOUR_DEV_PASSWORD` and `ROKU_IP`.

---

## 3. Find the channel

- Home screen → **My channels** / recently added → **308 Media**
- Or search your channel list for “308 Media”

---

## 4. How to use

| Remote | Action |
|--------|--------|
| **OK** on Main Menu item | Open that section |
| **Back** from a section | Return to Main Menu |
| **OK** on a radio station | Play live AAC |
| **OK** on an OTR show | Open episode list |
| **OK** on an episode | Play MP3 |
| **Play** while OTR playing | Pause / resume |
| **Back** while playing | Stop playback |
| **OK** on TV item / About | Show info panel |

---

## 5. Live Radio stations

KNEB-AM, KNEB-FM The Brand, KMOR, KOZY, KHYY The Trail, KOLT, KCMI Hope Radio, KETT Spirit Catholic, KLJV K-Love, KDAI Air1.

Stream format: **`es.aac-adts`**

---

## 6. Old Time Radio catalog

17 shows · 333 episodes (same as prior OTR channel). Bundled in the zip; channel also refreshes from the shop portal catalog when online:

`https://desktop-scgqjsc.tailcd6758.ts.net/apps/roku-otr/catalog.json`

Stream format: **`mp3`** (Archive.org). Credit: Internet Archive public-domain / Community Audio collections.

---

## 7. Download from the shop portal

- LAN: http://192.168.1.2:3080/apps/roku-308-media/
- Tailscale: https://desktop-scgqjsc.tailcd6758.ts.net/apps/roku-308-media/

Also linked from the portal home as **308 Media (Roku)**. Older Local Media / OTR portal pages point here for the combined install.

---

## Notes

- Developer sideload only — not a Channel Store app.
- Reinstall this one zip at `http://ROKU_IP` whenever you update; it replaces the previous sideload.
- Do not expect Local Media and Old Time Radio to coexist as two separate sideloads.

## b16 (2026-09-27)
Same as b15 plus a watch-log ping on playback start (random per-install id; nothing personal). Install 308Media.zip (= 308Media-b16.zip, md5 20a2c166dbd037f7a977ece079a124e9). Previous build: 308Media-b15.zip.

## b17 (2026-10-01)
Same as b16 plus **shared watched / resume progress**: the channel now syncs with the same household store the web player uses (`/api/media-progress` on the shop server), so "Watched" marks and "Resume" points follow you between the Roku and the web player. The Roku's own saved progress stays as the offline fallback; if the shop server can't be reached nothing changes and nothing is blocked. Content and menus are unchanged. Install 308Media.zip (= 308Media-b17.zip, md5 6809dee75978c177a77787f577e61717). Previous build: 308Media-b16.zip (rollback).

**How to install b17 on the Roku (same as every other build):**
1. Download `308Media.zip` from http://192.168.1.2:3080/apps/roku-308-media/308Media.zip (home Wi-Fi) or https://desktop-scgqjsc.tailcd6758.ts.net/apps/roku-308-media/308Media.zip. Save it on the PC or phone.
2. Make sure the Roku is on. In a browser on the same network open `http://ROKU_IP` (the IP shown on the Roku's developer screen; log in with the developer password).
3. Under **Install utility** click **Upload**, pick `308Media.zip`, click **Install**. Wait for "Install Success / Application Received: Replace". The channel opens by itself.
4. Check: open any episode, play 20+ seconds, press Back, and in the web player (same show) the episode shows "Resume". Or mark one watched on the web player, then on the Roku go Home (wait a few seconds) and open that show: it shows Played.
5. To go back to b16: install `308Media-b16.zip` the same way.

## b18 (2026-10-02)
Same as b17 but **Shop Cams removed** (tile, camera screens and all camera requests are gone). Nothing else changed: content, menus, shared watched/resume progress. Install 308Media.zip (= 308Media-b18.zip, md5 555bca787913d579028e0d1c08af2668). Previous build: 308Media-b17.zip (rollback; it also stops showing the cam tile now because home.json no longer has `cams`).

**How to install b18 on the Roku:**
1. Download `308Media.zip` from http://192.168.1.2:3080/apps/roku-308-media/308Media.zip (home Wi-Fi) or https://desktop-scgqjsc.tailcd6758.ts.net/apps/roku-308-media/308Media.zip.
2. In a browser on the same network open `http://ROKU_IP` (log in with the developer password).
3. **Install utility > Upload**, pick `308Media.zip`, **Install**. It replaces the old one and the channel opens by itself.


## b20 (2026-10-02)
Same as b19 plus **"Add profile"** on the Who's watching? screen (Roku and web player). Content and menus are unchanged. Install 308Media.zip (= 308Media-b20.zip, md5 0b426be7eae70c6ac992dc739a3cd057). Previous build: 308Media-b19.zip (rollback).
- **Roku:** the last tile on the picker is **+ Add profile**. Press OK, type the name on the Roku on-screen keyboard (letters, numbers, spaces; 1-20 characters), choose **Add**. The new profile is created on the shop server and selected right away. Back/Cancel closes the keyboard. The picker also refreshes its list from the server every time it opens (offline: it shows the saved list; adding needs the internet and says so if it can't reach the server). Up to 12 profiles.
- **Web player:** **+ Add profile** tile; click it, type a name, **Add**. The picker re-reads the list every time it opens, so profiles added on another device appear.
- There is no delete button on purpose: to remove a profile edit `C:\308-Server\data\profiles.json` on the shop PC (never remove `ron`).
- Install: same steps as b19 below (download `308Media.zip`, Roku web page > Install utility > Upload). To go back install `308Media-b19.zip`.

## b19 (2026-10-02)
Same as b18 plus **per-person profiles: Ron, Cindy, Chris.** Each person gets their own watched / resume list (Roku and web player). Content and menus are unchanged. Install 308Media.zip (= 308Media-b19.zip, md5 2c4a094b93a4c58bec3cb702a29b2de0). Previous build: 308Media-b18.zip (rollback).

**How it works on the Roku**
- First launch after installing b19: a full-screen **"Who's watching?"** appears. Press Up/Down, then OK on your name. The Roku remembers it, so the picker does **not** come back on later launches (playback is never blocked).
- To switch person: on the Home screen press **\*** (the star/options button) → **Switch profile** → pick a name. (The same \* menu also has the old Holiday preview toggle.) The footer on Home shows "Profile: <name>".
- Ron's watched/resume marks from b16–b18 stay with **Ron** (pick Ron the first time). Cindy and Chris start empty.
- Back on the very first picker leaves the channel.

**How it works on the web player** (http://192.168.1.2:3080/apps/media/player/ or the Funnel URL): the first time a browser opens it a "Who's watching?" screen appears; tap your name. The header button **Profile: <name>** switches person any time. The choice is remembered per browser/phone.

**Old builds:** Roku b16–b18 and old cached web pages don't know about profiles; they keep working and everything they save counts as **Ron's**.

**How to install b19 on the Roku (same as every other build):**
1. Download `308Media.zip` from http://192.168.1.2:3080/apps/roku-308-media/308Media.zip (home Wi-Fi) or https://desktop-scgqjsc.tailcd6758.ts.net/apps/roku-308-media/308Media.zip.
2. In a browser on the same network open `http://ROKU_IP` (developer password).
3. **Install utility > Upload**, pick `308Media.zip`, **Install**. It replaces the old one and the channel opens by itself.
4. To go back: install `308Media-b18.zip` the same way.


## b21 (2026-10-02)
Fix: **when the Roku screensaver comes on during old-time-radio (audio) playback the episode was not marked listened and the next episode did not start.** Content, menus, profiles, progress sync and Add profile are unchanged. Install 308Media.zip (= 308Media-b21.zip, md5 7007b822a2bb801af05ebddc0dda5321). To go back install `308Media-b20.zip` (rollback).
- The Roku screensaver is now blocked while audio is playing (paused/idle screens still get the screensaver).
- Backup: once a second the channel checks the player itself, so a missed "finished" is caught: the episode is marked listened, pushed to the server, and the next one starts (Up Next countdown, as before).
- The listened mark also happens the moment playback passes 95% (not only on the 15-second timer), and a stream that drops in its last 5% counts as finished.
- The Up Next countdown now runs on the clock, so it always finishes on time.
- Not tested on a real Roku (cannot be done from the shop PC).
- Install: Roku web page `http://<Roku IP>` > developer password > Install utility > Upload `308Media.zip` > Install.

## b22 (2026-10-03)
Fix for "the profiles went away" (no picker / no obvious profile on the Roku): the **"Who's watching?" picker now opens on every launch** (your last profile is pre-selected; Back keeps it), there is a **"Profile: <name>" tile at the end of Home** (OK = switch profile), and the footer is larger and gold: **"Profile: <name>  ·  v1.4 build 22"**. Everything else (screensaver/end-detection fix, Add profile, sync) is unchanged. Install 308Media.zip (= 308Media-b22.zip, md5 185f4626debd724f5291afd2d3021599). To go back install `308Media-b21.zip` (rollback).
Sideload: download https://desktop-scgqjsc.tailcd6758.ts.net/apps/roku-308-media/308Media.zip, open http://<Roku IP> in a browser, developer password, Install utility > Upload > Install. First launch: the picker appears; pick **Ron** to keep your old watched marks (they live on the server under Ron and in the Roku registry).
