# emrodev/ipvio-stream architecture

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

- Interactive diagram: https://gitdiagram.com/emrodev/ipvio-stream
- Repository: https://github.com/emrodev/ipvio-stream

## Overview

IPVIO Stream is an Android TV/Google TV/Fire TV IPTV player: users add their own playlist, browse or search its live and on-demand catalog, then play a selected item. Distinct branches cover live guide and catch-up, sports, subtitle search, and personal data/backup. The README documents these product capabilities; sampled source confirms some UI-to-store and subtitle-search relationships. Many feature implementations were not sampled, so their internal links are omitted rather than inferred.

Main entry points: [`app/src/main/java/com/ipvio/stream/PlayerScreen.kt`](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/PlayerScreen.kt) (Media player), [`app/src/main/java/com/ipvio/stream/PlaylistStore.kt`](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/PlaylistStore.kt) (Playlist store), [`app/src/main/java/com/ipvio/stream/HomeScreen.kt`](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/HomeScreen.kt) (Home), [`app/src/main/java/com/ipvio/stream/DetailScreen.kt`](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/DetailScreen.kt) (Browse and details)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_catalog["Playlist and discovery"]
  node_playlist_input["Playlist input<br/>[ListImportUi.kt]"]
  node_provider_api["Provider APIs<br/>[XtreamApi.kt]"]
  node_playlist_store[("Playlist store<br/>[PlaylistStore.kt]")]
  node_home["Home<br/>[HomeScreen.kt]"]
  node_browse["Browse and details<br/>[DetailScreen.kt]"]
  node_search["Catalog search<br/>[SearchScreen.kt]"]
  node_metadata["Title metadata<br/>[Meta.kt]"]
end

subgraph group_playback["Playback and live TV"]
  node_player["Media player<br/>[PlayerScreen.kt]"]
  node_playback_logic["Playback control<br/>[PlaybackLogic.kt]"]
  node_live_tv["Live TV<br/>[LiveTab.kt]"]
  node_guide["TV guide<br/>[Epg.kt]"]
  node_catchup["Catch-up<br/>[Catchup.kt]"]
  node_sports["Sports<br/>[SportLeague.kt]"]
  node_subtitles["Subtitle search<br/>[SubSearch.kt]"]
end

subgraph group_personal["Personal features"]
  node_profiles[("Profiles and controls<br/>[Profiles.kt]")]
  node_personal_state[("History and favourites<br/>[Mem.kt]")]
  node_backup["Backup and transfer<br/>[Backup.kt]"]
end

subgraph group_platform["App experience"]
  node_settings["Settings<br/>[SettingsHub.kt]"]
  node_phone_import["Phone import<br/>[PhoneImport.kt]"]
  node_appearance["Themes and language<br/>[Look.kt]"]
  node_main["Android app entry<br/>[MainActivity.kt]"]
end

node_viewer(("Viewer"))
node_iptv_provider{{"Playlist provider"}}
node_subtitle_services{{"Subtitle services"}}
node_google_drive{{"Google Drive"}}

node_viewer -->|"opens app"| node_main
node_main -.->|"shows home"| node_home
node_viewer -->|"adds playlist"| node_playlist_input
node_playlist_input -.->|"loads playlist"| node_playlist_store
node_playlist_store -->|"queries provider"| node_provider_api
node_iptv_provider -->|"serves playlist data"| node_playlist_store
node_home -->|"reads catalog"| node_playlist_store
node_search -->|"reads catalog"| node_playlist_store
node_viewer -->|"browses titles"| node_browse
node_browse -->|"shows title details"| node_metadata
node_browse -->|"starts playback"| node_player
node_home -.->|"starts playback"| node_player
node_player -.->|"controls playback"| node_playback_logic
node_viewer -->|"selects channel"| node_live_tv
node_live_tv -->|"plays channel"| node_player
node_live_tv -->|"shows schedule"| node_guide
node_guide -->|"offers archive"| node_catchup
node_viewer -->|"opens sports"| node_sports
node_player -->|"searches subtitles"| node_subtitles
node_subtitles -->|"requests subtitles"| node_subtitle_services
node_viewer -->|"chooses profile"| node_profiles
node_player -->|"records viewing"| node_personal_state
node_viewer -->|"backs up data"| node_backup
node_backup -.->|"syncs optionally"| node_google_drive
node_viewer -->|"sends input"| node_phone_import
node_phone_import -.->|"provides playlist data"| node_playlist_input
node_viewer -->|"configures app"| node_settings
node_settings -->|"sets appearance"| node_appearance

click node_playlist_input "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/ListImportUi.kt"
click node_provider_api "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/XtreamApi.kt"
click node_playlist_store "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/PlaylistStore.kt"
click node_home "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/HomeScreen.kt"
click node_browse "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/DetailScreen.kt"
click node_search "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/SearchScreen.kt"
click node_metadata "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/Meta.kt"
click node_player "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/PlayerScreen.kt"
click node_playback_logic "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/PlaybackLogic.kt"
click node_live_tv "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/LiveTab.kt"
click node_guide "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/Epg.kt"
click node_catchup "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/Catchup.kt"
click node_sports "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/SportLeague.kt"
click node_subtitles "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/SubSearch.kt"
click node_profiles "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/Profiles.kt"
click node_personal_state "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/Mem.kt"
click node_backup "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/Backup.kt"
click node_settings "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/SettingsHub.kt"
click node_phone_import "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/PhoneImport.kt"
click node_appearance "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/Look.kt"
click node_main "https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/MainActivity.kt"

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_playlist_input,node_provider_api,node_playlist_store,node_home,node_browse,node_search,node_metadata,node_viewer toneBlue
class node_player,node_playback_logic,node_live_tv,node_guide,node_catchup,node_sports,node_subtitles toneAmber
class node_profiles,node_personal_state,node_backup toneMint
class node_settings,node_phone_import,node_appearance,node_main toneRose
class node_iptv_provider,node_subtitle_services,node_google_drive toneIndigo
```

## Components

### Playlist and discovery

- [Playlist input](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/ListImportUi.kt): `app/src/main/java/com/ipvio/stream/ListImportUi.kt`
- [Provider APIs](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/XtreamApi.kt): `app/src/main/java/com/ipvio/stream/XtreamApi.kt`
- [Playlist store](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/PlaylistStore.kt): `app/src/main/java/com/ipvio/stream/PlaylistStore.kt`
- [Home](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/HomeScreen.kt): `app/src/main/java/com/ipvio/stream/HomeScreen.kt`
- [Browse and details](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/DetailScreen.kt): `app/src/main/java/com/ipvio/stream/DetailScreen.kt`
- [Catalog search](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/SearchScreen.kt): `app/src/main/java/com/ipvio/stream/SearchScreen.kt`
- [Title metadata](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/Meta.kt): `app/src/main/java/com/ipvio/stream/Meta.kt`

### Playback and live TV

- [Media player](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/PlayerScreen.kt): `app/src/main/java/com/ipvio/stream/PlayerScreen.kt`
- [Playback control](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/PlaybackLogic.kt): `app/src/main/java/com/ipvio/stream/PlaybackLogic.kt`
- [Live TV](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/LiveTab.kt): `app/src/main/java/com/ipvio/stream/LiveTab.kt`
- [TV guide](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/Epg.kt): `app/src/main/java/com/ipvio/stream/Epg.kt`
- [Catch-up](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/Catchup.kt): `app/src/main/java/com/ipvio/stream/Catchup.kt`
- [Sports](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/SportLeague.kt): `app/src/main/java/com/ipvio/stream/SportLeague.kt`
- [Subtitle search](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/SubSearch.kt): `app/src/main/java/com/ipvio/stream/SubSearch.kt`

### Personal features

- [Profiles and controls](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/Profiles.kt): `app/src/main/java/com/ipvio/stream/Profiles.kt`
- [History and favourites](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/Mem.kt): `app/src/main/java/com/ipvio/stream/Mem.kt`
- [Backup and transfer](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/Backup.kt): `app/src/main/java/com/ipvio/stream/Backup.kt`

### App experience

- [Settings](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/SettingsHub.kt): `app/src/main/java/com/ipvio/stream/SettingsHub.kt`
- [Phone import](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/PhoneImport.kt): `app/src/main/java/com/ipvio/stream/PhoneImport.kt`
- [Themes and language](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/Look.kt): `app/src/main/java/com/ipvio/stream/Look.kt`
- [Android app entry](https://github.com/emrodev/ipvio-stream/blob/main/app/src/main/java/com/ipvio/stream/MainActivity.kt): `app/src/main/java/com/ipvio/stream/MainActivity.kt`

### Other components

- **Viewer**
- **Playlist provider**
- **Subtitle services**
- **Google Drive**

## Connections

- Viewer → Android app entry: opens app (evidence: `README.md`)
- Android app entry → Home: shows home (evidence: `app/src/main/java/com/ipvio/stream/MainActivity.kt`)
- Viewer → Playlist input: adds playlist (evidence: `README.md`)
- Playlist input → Playlist store: loads playlist
- Playlist store → Provider APIs: queries provider (evidence: `app/src/main/java/com/ipvio/stream/PlaylistStore.kt`)
- Playlist provider → Playlist store: serves playlist data (evidence: `README.md`)
- Home → Playlist store: reads catalog (evidence: `app/src/main/java/com/ipvio/stream/HomeScreen.kt`)
- Catalog search → Playlist store: reads catalog (evidence: `app/src/main/java/com/ipvio/stream/SearchScreen.kt`)
- Viewer → Browse and details: browses titles (evidence: `README.md`)
- Browse and details → Title metadata: shows title details (evidence: `README.md`)
- Browse and details → Media player: starts playback (evidence: `README.md`)
- Home → Media player: starts playback
- Media player → Playback control: controls playback
- Viewer → Live TV: selects channel (evidence: `README.md`)
- Live TV → Media player: plays channel (evidence: `README.md`)
- Live TV → TV guide: shows schedule (evidence: `README.md`)
- TV guide → Catch-up: offers archive (evidence: `README.md`)
- Viewer → Sports: opens sports (evidence: `README.md`)
- Media player → Subtitle search: searches subtitles (evidence: `app/src/main/java/com/ipvio/stream/PlayerScreen.kt`)
- Subtitle search → Subtitle services: requests subtitles (evidence: `app/src/main/java/com/ipvio/stream/SubSearch.kt`)
- Viewer → Profiles and controls: chooses profile (evidence: `README.md`)
- Media player → History and favourites: records viewing (evidence: `README.md`)
- Viewer → Backup and transfer: backs up data (evidence: `README.md`)
- Backup and transfer → Google Drive: syncs optionally (evidence: `README.md`)
- Viewer → Phone import: sends input (evidence: `README.md`)
- Phone import → Playlist input: provides playlist data
- Viewer → Settings: configures app (evidence: `README.md`)
- Settings → Themes and language: sets appearance (evidence: `README.md`)
