# ostlerdev/popcorntv architecture

> Architecture diagram of the GitHub repository ostlerdev/popcorntv, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/ostlerdev/popcorntv
- Repository: https://github.com/ostlerdev/popcorntv

## Overview

PopcornTV was an Apple TV media-browsing and playback application: an Apple TV redirected through the host’s DNS/web server, received generated XML catalogs, and could select and play movie or TV streams. The graph retains the documented browsing, quality selection, subtitles, favorites, and fan-art capabilities. Source excerpts are partial; where they do not establish exact wiring, related components are shown without speculative edges.

Main entry points: [`webserver.js`](https://github.com/ostlerdev/popcorntv/blob/master/webserver.js) (HTTP and HTTPS server), [`streamer.js`](https://github.com/ostlerdev/popcorntv/blob/master/streamer.js) (Streamer selection), [`TVApi.js`](https://github.com/ostlerdev/popcorntv/blob/master/TVApi.js) (TV metadata), [`dns.js`](https://github.com/ostlerdev/popcorntv/blob/master/dns.js) (DNS redirection)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Apple TV experience"]
  node_atv_entry["Application entry<br/>[atv.js]"]
  node_dns["DNS redirection<br/>[dns.js]"]
  node_web["HTTP and HTTPS server<br/>[webserver.js]"]
  node_ui["Client interface<br/>[application.js]"]
  node_templates["XML templates"]
  node_xml["XML generation<br/>[XMLGenerator.js]"]
end

subgraph group_catalog["Catalog and metadata"]
  node_movies["Movie metadata<br/>[MoviesAPI.js]"]
  node_tv["TV metadata<br/>[TVApi.js]"]
  node_fanart["Fan-art generation<br/>[fanartGenerator.js]"]
end

subgraph group_playback["Playback delivery"]
  node_streamer_server["Streaming server<br/>[streamer-server.js]"]
  node_streamer["Streamer selection<br/>[streamer.js]"]
  node_base_streamer["Stream progress<br/>[base.js]"]
  node_torrent_streamer["Torrent streamer<br/>[torrent.js]"]
  node_http_streamer["HTTP streamer<br/>[http.js]"]
  node_file_streamer["File streamer<br/>[file.js]"]
  node_youtube_streamer["YouTube streamer<br/>[youtube.js]"]
end

subgraph group_services["Settings and integrations"]
  node_settings["User settings<br/>[settings.js]"]
  node_settings_store[("Settings file<br/>[settings.js]")]
  node_subtitle_api["Subtitle lookup<br/>[SubtitleAPI.js]"]
end

node_apple_tv(("Apple TV"))
node_trakt["Trakt service"]
node_opensubtitles["OpenSubtitles"]
node_torrent_peers(("Torrent peers"))

node_atv_entry -->|"starts"| node_web
node_atv_entry -->|"starts"| node_dns
node_apple_tv -->|"queries"| node_dns
node_dns -->|"redirects"| node_web
node_apple_tv -->|"requests"| node_web
node_web -->|"requests XML"| node_xml
node_xml -->|"renders"| node_templates
node_web -->|"requests metadata"| node_movies
node_web -->|"requests metadata"| node_tv
node_tv -.->|"requests data"| node_trakt
node_tv -->|"requests artwork"| node_fanart
node_web -->|"reads and updates"| node_settings
node_settings -->|"reads and writes"| node_settings_store
node_web -->|"requests subtitles"| node_subtitle_api
node_subtitle_api -.->|"searches and downloads"| node_opensubtitles
node_web -->|"serves streams"| node_streamer_server
node_streamer_server -->|"selects stream"| node_streamer
node_streamer -->|"uses base"| node_base_streamer
node_streamer -->|"selects source"| node_torrent_streamer
node_streamer -->|"selects source"| node_http_streamer
node_streamer -->|"selects source"| node_file_streamer
node_streamer -->|"selects source"| node_youtube_streamer
node_torrent_streamer -->|"retrieves pieces"| node_torrent_peers
node_web -->|"serves interface"| node_ui
node_ui -->|"presents controls"| node_apple_tv

click node_atv_entry "https://github.com/ostlerdev/popcorntv/blob/master/atv.js"
click node_dns "https://github.com/ostlerdev/popcorntv/blob/master/dns.js"
click node_web "https://github.com/ostlerdev/popcorntv/blob/master/webserver.js"
click node_ui "https://github.com/ostlerdev/popcorntv/blob/master/assets/js/application.js"
click node_templates "https://github.com/ostlerdev/popcorntv/tree/master/assets/templates"
click node_xml "https://github.com/ostlerdev/popcorntv/blob/master/XMLGenerator.js"
click node_movies "https://github.com/ostlerdev/popcorntv/blob/master/MoviesAPI.js"
click node_tv "https://github.com/ostlerdev/popcorntv/blob/master/TVApi.js"
click node_fanart "https://github.com/ostlerdev/popcorntv/blob/master/fanartGenerator.js"
click node_settings "https://github.com/ostlerdev/popcorntv/blob/master/settings.js"
click node_settings_store "https://github.com/ostlerdev/popcorntv/blob/master/settings.js"
click node_subtitle_api "https://github.com/ostlerdev/popcorntv/blob/master/SubtitleAPI.js"
click node_streamer_server "https://github.com/ostlerdev/popcorntv/blob/master/streamer-server.js"
click node_streamer "https://github.com/ostlerdev/popcorntv/blob/master/streamer.js"
click node_base_streamer "https://github.com/ostlerdev/popcorntv/blob/master/lib/streamers/base.js"
click node_torrent_streamer "https://github.com/ostlerdev/popcorntv/blob/master/lib/streamers/torrent.js"
click node_http_streamer "https://github.com/ostlerdev/popcorntv/blob/master/lib/streamers/http.js"
click node_file_streamer "https://github.com/ostlerdev/popcorntv/blob/master/lib/streamers/file.js"
click node_youtube_streamer "https://github.com/ostlerdev/popcorntv/blob/master/lib/streamers/youtube.js"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_atv_entry,node_dns,node_web,node_ui,node_templates,node_xml toneBlue
class node_movies,node_tv,node_fanart toneAmber
class node_streamer_server,node_streamer,node_base_streamer,node_torrent_streamer,node_http_streamer,node_file_streamer,node_youtube_streamer toneMint
class node_settings,node_settings_store,node_subtitle_api toneRose
class node_apple_tv,node_trakt,node_opensubtitles,node_torrent_peers toneIndigo
```

## Components

### Apple TV experience

- [Application entry](https://github.com/ostlerdev/popcorntv/blob/master/atv.js): `atv.js`
- [DNS redirection](https://github.com/ostlerdev/popcorntv/blob/master/dns.js): `dns.js`
- [HTTP and HTTPS server](https://github.com/ostlerdev/popcorntv/blob/master/webserver.js): `webserver.js`
- [Client interface](https://github.com/ostlerdev/popcorntv/blob/master/assets/js/application.js): `assets/js/application.js`
- [XML templates](https://github.com/ostlerdev/popcorntv/tree/master/assets/templates): `assets/templates`
- [XML generation](https://github.com/ostlerdev/popcorntv/blob/master/XMLGenerator.js): `XMLGenerator.js`

### Catalog and metadata

- [Movie metadata](https://github.com/ostlerdev/popcorntv/blob/master/MoviesAPI.js): `MoviesAPI.js`
- [TV metadata](https://github.com/ostlerdev/popcorntv/blob/master/TVApi.js): `TVApi.js`
- [Fan-art generation](https://github.com/ostlerdev/popcorntv/blob/master/fanartGenerator.js): `fanartGenerator.js`

### Playback delivery

- [Streaming server](https://github.com/ostlerdev/popcorntv/blob/master/streamer-server.js): `streamer-server.js`
- [Streamer selection](https://github.com/ostlerdev/popcorntv/blob/master/streamer.js): `streamer.js`
- [Stream progress](https://github.com/ostlerdev/popcorntv/blob/master/lib/streamers/base.js): `lib/streamers/base.js`
- [Torrent streamer](https://github.com/ostlerdev/popcorntv/blob/master/lib/streamers/torrent.js): `lib/streamers/torrent.js`
- [HTTP streamer](https://github.com/ostlerdev/popcorntv/blob/master/lib/streamers/http.js): `lib/streamers/http.js`
- [File streamer](https://github.com/ostlerdev/popcorntv/blob/master/lib/streamers/file.js): `lib/streamers/file.js`
- [YouTube streamer](https://github.com/ostlerdev/popcorntv/blob/master/lib/streamers/youtube.js): `lib/streamers/youtube.js`

### Settings and integrations

- [User settings](https://github.com/ostlerdev/popcorntv/blob/master/settings.js): `settings.js`
- [Settings file](https://github.com/ostlerdev/popcorntv/blob/master/settings.js): `settings.js`
- [Subtitle lookup](https://github.com/ostlerdev/popcorntv/blob/master/SubtitleAPI.js): `SubtitleAPI.js`

### Other components

- **Apple TV**
- **Trakt service**
- **OpenSubtitles**
- **Torrent peers**

## Connections

- Application entry → HTTP and HTTPS server: starts
- Application entry → DNS redirection: starts
- Apple TV → DNS redirection: queries
- DNS redirection → HTTP and HTTPS server: redirects
- Apple TV → HTTP and HTTPS server: requests
- HTTP and HTTPS server → XML generation: requests XML
- XML generation → XML templates: renders
- HTTP and HTTPS server → Movie metadata: requests metadata
- HTTP and HTTPS server → TV metadata: requests metadata
- TV metadata → Trakt service: requests data
- TV metadata → Fan-art generation: requests artwork
- HTTP and HTTPS server → User settings: reads and updates
- User settings → Settings file: reads and writes
- HTTP and HTTPS server → Subtitle lookup: requests subtitles
- Subtitle lookup → OpenSubtitles: searches and downloads
- HTTP and HTTPS server → Streaming server: serves streams
- Streaming server → Streamer selection: selects stream
- Streamer selection → Stream progress: uses base
- Streamer selection → Torrent streamer: selects source
- Streamer selection → HTTP streamer: selects source
- Streamer selection → File streamer: selects source
- Streamer selection → YouTube streamer: selects source
- Torrent streamer → Torrent peers: retrieves pieces
- HTTP and HTTPS server → Client interface: serves interface
- Client interface → Apple TV: presents controls
