# mcvo1705/ybmusictv architecture

> Architecture diagram of the GitHub repository mcvo1705/ybmusictv, 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/mcvo1705/ybmusictv
- Repository: https://github.com/mcvo1705/ybmusictv

## Overview

YB Music TV is a native Android TV music-streaming app. Users search YouTube or paste a link, choose a track, and play audio; they can also manage offline playlists, favorites, listening/search history, and saved playback/settings. The graph follows evidenced calls from the activity through navigation and the shared ViewModel. YouTube extraction, ranking, stream resolution, and SABR fallback are documented capabilities; source excerpts do not show every connection, so unsupported links are omitted.

Main entry points: [`app/src/main/java/com/ybmusic/tv/ui/MainViewModel.kt`](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/ui/MainViewModel.kt) (App state), [`app/src/main/java/com/ybmusic/tv/ui/navigation/AppNavigation.kt`](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/ui/navigation/AppNavigation.kt) (TV navigation), [`app/src/main/java/com/ybmusic/tv/data/repository/MusicRepository.kt`](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/data/repository/MusicRepository.kt) (Music repository), [`app/src/main/java/com/ybmusic/tv/MainActivity.kt`](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/MainActivity.kt) (Activity entry)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["TV application"]
  node_activity["Activity entry<br/>[MainActivity.kt]"]
  node_navigation["TV navigation<br/>[AppNavigation.kt]"]
  node_viewmodel["App state<br/>[MainViewModel.kt]"]
  node_settingsui["Settings screen<br/>[SettingsScreen.kt]"]
  node_components["TV components<br/>[TvComponents.kt]"]
end

subgraph group_music["Music discovery"]
  node_searchui["Search screen<br/>[SearchScreen.kt]"]
  node_tracks["Track models<br/>[Track.kt]"]
  node_youtube["YouTube source<br/>[YouTubeSource.kt]"]
  node_ranker["Search ranking<br/>[SearchRanker.kt]"]
  node_downloader["NewPipe downloader"]
end

subgraph group_library["Library and persistence"]
  node_libraryui["Library screen<br/>[LibraryScreen.kt]"]
  node_repository["Music repository<br/>[MusicRepository.kt]"]
  node_room[("Room database<br/>[AppDatabase.kt]")]
  node_settingsrepo["Settings repository"]
end

subgraph group_playback["Playback"]
  node_player["Player controller"]
  node_service["Playback service<br/>[PlaybackService.kt]"]
end

node_user(("TV listener"))
node_youtube_service{{"YouTube"}}

node_user -->|"opens app"| node_activity
node_activity -->|"obtains state"| node_viewmodel
node_activity -->|"renders"| node_navigation
node_navigation -->|"routes to"| node_searchui
node_navigation -->|"routes to"| node_libraryui
node_navigation -->|"routes to"| node_settingsui
node_navigation -->|"renders player"| node_components
node_searchui -->|"submits actions"| node_viewmodel
node_libraryui -->|"submits actions"| node_viewmodel
node_settingsui -->|"submits actions"| node_viewmodel
node_viewmodel -->|"requests data"| node_repository
node_viewmodel -->|"controls playback"| node_player
node_repository -->|"searches source"| node_youtube
node_repository -->|"ranks results"| node_ranker
node_repository -->|"reads and writes"| node_room
node_youtube -->|"produces tracks"| node_tracks
node_ranker -->|"orders tracks"| node_tracks
node_activity -->|"initializes extractor"| node_downloader
node_youtube -.->|"searches and resolves streams"| node_youtube_service
node_player -->|"persists listening"| node_repository
node_player -->|"saves queue state"| node_settingsrepo
node_player -.->|"controls session"| node_service

click node_activity "https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/MainActivity.kt"
click node_navigation "https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/ui/navigation/AppNavigation.kt"
click node_viewmodel "https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/ui/MainViewModel.kt"
click node_searchui "https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/ui/screen/SearchScreen.kt"
click node_libraryui "https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/ui/screen/LibraryScreen.kt"
click node_settingsui "https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/ui/screen/SettingsScreen.kt"
click node_components "https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/ui/component/TvComponents.kt"
click node_tracks "https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/data/model/Track.kt"
click node_repository "https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/data/repository/MusicRepository.kt"
click node_youtube "https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/data/youtube/YouTubeSource.kt"
click node_ranker "https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/data/youtube/SearchRanker.kt"
click node_downloader "https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/data/youtube/NewPipeDownloader.kt"
click node_room "https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/data/database/AppDatabase.kt"
click node_settingsrepo "https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/data/repository/SettingsRepository.kt"
click node_player "https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/core/player/PlayerController.kt"
click node_service "https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/service/PlaybackService.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_activity,node_navigation,node_viewmodel,node_settingsui,node_components toneBlue
class node_searchui,node_tracks,node_youtube,node_ranker,node_downloader toneAmber
class node_libraryui,node_repository,node_room,node_settingsrepo toneMint
class node_player,node_service toneRose
class node_user,node_youtube_service toneIndigo
```

## Components

### TV application

- [Activity entry](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/MainActivity.kt): `app/src/main/java/com/ybmusic/tv/MainActivity.kt`
- [TV navigation](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/ui/navigation/AppNavigation.kt): `app/src/main/java/com/ybmusic/tv/ui/navigation/AppNavigation.kt`
- [App state](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/ui/MainViewModel.kt): `app/src/main/java/com/ybmusic/tv/ui/MainViewModel.kt`
- [Settings screen](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/ui/screen/SettingsScreen.kt): `app/src/main/java/com/ybmusic/tv/ui/screen/SettingsScreen.kt`
- [TV components](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/ui/component/TvComponents.kt): `app/src/main/java/com/ybmusic/tv/ui/component/TvComponents.kt`

### Music discovery

- [Search screen](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/ui/screen/SearchScreen.kt): `app/src/main/java/com/ybmusic/tv/ui/screen/SearchScreen.kt`
- [Track models](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/data/model/Track.kt): `app/src/main/java/com/ybmusic/tv/data/model/Track.kt`
- [YouTube source](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/data/youtube/YouTubeSource.kt): `app/src/main/java/com/ybmusic/tv/data/youtube/YouTubeSource.kt`
- [Search ranking](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/data/youtube/SearchRanker.kt): `app/src/main/java/com/ybmusic/tv/data/youtube/SearchRanker.kt`
- [NewPipe downloader](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/data/youtube/NewPipeDownloader.kt): `app/src/main/java/com/ybmusic/tv/data/youtube/NewPipeDownloader.kt`

### Library and persistence

- [Library screen](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/ui/screen/LibraryScreen.kt): `app/src/main/java/com/ybmusic/tv/ui/screen/LibraryScreen.kt`
- [Music repository](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/data/repository/MusicRepository.kt): `app/src/main/java/com/ybmusic/tv/data/repository/MusicRepository.kt`
- [Room database](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/data/database/AppDatabase.kt): `app/src/main/java/com/ybmusic/tv/data/database/AppDatabase.kt`
- [Settings repository](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/data/repository/SettingsRepository.kt): `app/src/main/java/com/ybmusic/tv/data/repository/SettingsRepository.kt`

### Playback

- [Player controller](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/core/player/PlayerController.kt): `app/src/main/java/com/ybmusic/tv/core/player/PlayerController.kt`
- [Playback service](https://github.com/mcvo1705/ybmusictv/blob/main/app/src/main/java/com/ybmusic/tv/service/PlaybackService.kt): `app/src/main/java/com/ybmusic/tv/service/PlaybackService.kt`

### Other components

- **TV listener**
- **YouTube**

## Connections

- TV listener → Activity entry: opens app (evidence: `app/src/main/java/com/ybmusic/tv/MainActivity.kt`)
- Activity entry → App state: obtains state (evidence: `app/src/main/java/com/ybmusic/tv/MainActivity.kt`)
- Activity entry → TV navigation: renders (evidence: `app/src/main/java/com/ybmusic/tv/MainActivity.kt`)
- TV navigation → Search screen: routes to (evidence: `app/src/main/java/com/ybmusic/tv/ui/navigation/AppNavigation.kt`)
- TV navigation → Library screen: routes to (evidence: `app/src/main/java/com/ybmusic/tv/ui/navigation/AppNavigation.kt`)
- TV navigation → Settings screen: routes to (evidence: `app/src/main/java/com/ybmusic/tv/ui/navigation/AppNavigation.kt`)
- TV navigation → TV components: renders player (evidence: `app/src/main/java/com/ybmusic/tv/ui/navigation/AppNavigation.kt`)
- Search screen → App state: submits actions (evidence: `app/src/main/java/com/ybmusic/tv/ui/screen/SearchScreen.kt`)
- Library screen → App state: submits actions (evidence: `app/src/main/java/com/ybmusic/tv/ui/screen/LibraryScreen.kt`)
- Settings screen → App state: submits actions (evidence: `app/src/main/java/com/ybmusic/tv/ui/screen/SettingsScreen.kt`)
- App state → Music repository: requests data (evidence: `app/src/main/java/com/ybmusic/tv/ui/MainViewModel.kt`)
- App state → Player controller: controls playback (evidence: `app/src/main/java/com/ybmusic/tv/ui/MainViewModel.kt`)
- Music repository → YouTube source: searches source (evidence: `app/src/main/java/com/ybmusic/tv/data/repository/MusicRepository.kt`)
- Music repository → Search ranking: ranks results (evidence: `app/src/main/java/com/ybmusic/tv/data/repository/MusicRepository.kt`)
- Music repository → Room database: reads and writes (evidence: `app/src/main/java/com/ybmusic/tv/data/repository/MusicRepository.kt`)
- YouTube source → Track models: produces tracks (evidence: `app/src/main/java/com/ybmusic/tv/data/youtube/YouTubeSource.kt`)
- Search ranking → Track models: orders tracks (evidence: `app/src/main/java/com/ybmusic/tv/data/youtube/SearchRanker.kt`)
- Activity entry → NewPipe downloader: initializes extractor (evidence: `app/src/main/java/com/ybmusic/tv/MainActivity.kt`)
- YouTube source → YouTube: searches and resolves streams (evidence: `README.md`)
- Player controller → Music repository: persists listening (evidence: `app/src/main/java/com/ybmusic/tv/core/player/PlayerController.kt`)
- Player controller → Settings repository: saves queue state (evidence: `app/src/main/java/com/ybmusic/tv/core/player/PlayerController.kt`)
- Player controller → Playback service: controls session (evidence: `README.md`)
